以下问题:我尝试从文本块中读出用户名。我通常使用.Net来解决这个问题,并尝试了LINQ和Regex,但是我找不到解决方案。
用户名的模式是'jane.doe‘(没有引号)。现在,我有以下代码序列:
Imports System.Text.RegularExpressions
Public Class Form1
Dim arrStrSplittet As String()
Dim strRegEx As String = "[a-z]+[.]{1}[a-z]+"
Dim regExKriterium As Regex = New Regex(strRegEx)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
arrStrSplittet = stringSplitten(TextBox1.Text)
TextBox2.Text = testFiltern(arrStrSplittet)
End Sub
Function testFiltern(text As String()) As String
Dim query = From x In text Where (regExKriterium.IsMatch(x)) Select x
Dim strBuild As New System.Text.StringBuilder()
For Each y As String In query
strBuild.AppendLine(y)
Next
MsgBox(strBuild.ToString())
Return strBuild.ToString()
End Function
Public Function stringSplitten(text As String) As String()
Dim arrX = Split(text, vbNewLine)
Return arrX
End Function
End Class我尝试以下输入:
Type Status Name
Benutzer Mustermann, Max (Server-name\max.mustermann)
Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
Benutzer Doe, Jane (Server-name\jane.doe)
Benutzer Svensson, Kalle (Server-name\kalle.svensson)
Benutzer Borg, Joe (Server-name\joe.borg)使用上面的代码,我得到了以下输出:
Benutzer Mustermann, Max (Server-name\max.mustermann)
Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
Benutzer Doe, Jane (Server-name\jane.doe)
Benutzer Svensson, Kalle (Server-name\kalle.svensson)
Benutzer Borg, Joe (Server-name\joe.borg)产出应是:
max.mustermann
otto.normalverbraucher
jane.doe
kalle.svensson
joe.borg是否可以更改LINQ中的对象x?有人有别的办法解决这个问题吗?目前,我有一个工作(但相当丑陋)的解决方案通过InStr。
我希望有人能帮我。提前感谢!米索岛
发布于 2022-08-04 14:16:06
这是我在使用.Net、Linq和Regex时所能得到的最接近可读性的格式。
var textBook = @"Type Status Name
Benutzer Mustermann, Max (Server-name\max.mustermann)
Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
Benutzer Doe, Jane (Server-name\jane.doe)
Benutzer Svensson, Kalle (Server-name\kalle.svensson)
Benutzer Borg, Joe (Server-name\joe.borg)";
//split by new lines
string[] lines = textBook.Split(
new string[] { Environment.NewLine },
StringSplitOptions.None
);
//removed line without regex match of username
var removedWordWithoutServerName = lines.Where(x => Regex.IsMatch(x, "[a-z]+[.]{1}[a-z]+")).ToList();
var userNames = new List<string>();
//split by Server-name\
foreach (var serverNameAndUserName in removedWordWithoutServerName.Select(serverName => serverName.Split(@"Server-name\")))
{
//Add only matching Regex and replace ")" with ""
userNames.AddRange(from s in serverNameAndUserName
where Regex.IsMatch(s, "[a-z]+[.]{1}[a-z]+")
select s.Replace(")", ""));
}
var returnUsernames = userNames;或简单的Linq,但可读性较低。
var textBook = @"Type Status Name
Benutzer Mustermann, Max (Server-name\max.mustermann)
Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
Benutzer Doe, Jane (Server-name\jane.doe)
Benutzer Svensson, Kalle (Server-name\kalle.svensson)
Benutzer Borg, Joe (Server-name\joe.borg)";
var userNames = new List<string>();
textBook.Split(new string[] { Environment.NewLine },StringSplitOptions.None)
.Where(x => Regex.IsMatch(x, "[a-z]+[.]{1}[a-z]+"))
.Select(x => x.Split(@"Server-name\")).ToList()
.ForEach(a =>
{
userNames.AddRange(from s in a
where Regex.IsMatch(s, "[a-z]+[.]{1}[a-z]+")
select s.Replace(")", ""));
});
var returnNames = userNames;发布于 2022-08-05 09:55:54
到目前为止,你的解决方案是完全过火的。Regex.Match将返回捕获,您可以使用()指定它们
Dim users = lines
.Select(Function(l) Regex.Match(l, "\(.+?\\(.+?)\)"))
.Where(Function(m) m.Success)
.Select(Function (m) m.Groups(1).Captures(0).Value)
.ToList()Regex如下所示
\( a转义打开的parenthesis.+?任意字符,惰性匹配(最小possible)\\ a转义backslash(开始capture.+? any characters)结束capture\)转义结束括号https://stackoverflow.com/questions/73236550
复制相似问题