首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何搜索文本中的模式,并提取符合模式的文本部分?

如何搜索文本中的模式,并提取符合模式的文本部分?
EN

Stack Overflow用户
提问于 2022-08-04 13:08:44
回答 2查看 32关注 0票数 1

以下问题:我尝试从文本块中读出用户名。我通常使用.Net来解决这个问题,并尝试了LINQ和Regex,但是我找不到解决方案。

用户名的模式是'jane.doe‘(没有引号)。现在,我有以下代码序列:

代码语言:javascript
复制
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

我尝试以下输入:

代码语言:javascript
复制
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)

使用上面的代码,我得到了以下输出:

代码语言:javascript
复制
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)

产出应是:

代码语言:javascript
复制
max.mustermann
otto.normalverbraucher
jane.doe
kalle.svensson
joe.borg

是否可以更改LINQ中的对象x?有人有别的办法解决这个问题吗?目前,我有一个工作(但相当丑陋)的解决方案通过InStr。

我希望有人能帮我。提前感谢!米索岛

EN

回答 2

Stack Overflow用户

发布于 2022-08-04 14:16:06

这是我在使用.Net、Linq和Regex时所能得到的最接近可读性的格式。

代码语言:javascript
复制
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,但可读性较低。

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2022-08-05 09:55:54

到目前为止,你的解决方案是完全过火的。Regex.Match将返回捕获,您可以使用()指定它们

代码语言:javascript
复制
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
  • \)转义结束括号
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73236550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档