RegEx用于捕获=和;之间的单词

时间:2019-05-27 17:19:51

标签: c# regex regex-lookarounds regex-group regex-greedy

我要从以下选项中选择word2

word2;word3
介于word2和行首之间的

;,除非中间有=。在这种情况下,我想从=开始而不是从行的开始 就像来自

word2
word1=word2;word3

我尝试使用此正则表达式

(?<=\=|^).*?(?=;)

从中选择word2

word2;word3

还有整个word1=word2

word1=word2;word3

3 个答案:

答案 0 :(得分:2)

您可以使用可选的组来检查单词,后跟等号并在第一个捕获组中捕获值:

^(?:\w+=)?(\w+);

说明

  • ^字符串的开头
  • (?:\w+=)?可选的非捕获组,匹配1个以上字符的字符,后跟=
  • (\w+)在第一个捕获组中捕获1个以上的字符字符
  • ;匹配;

查看regex demo

在.NET中,您也可以使用:

(?<=^(?:\w+=)?)\w+(?=;)

Regex demo | C# demo

enter image description here

答案 1 :(得分:2)

应该有很多选择,也许最后一个中有正则表达式。

但是,如果我们希望使用一个表达式来解决这个问题,让我们从一个简单的例子开始,探讨其他选项,也许类似于:

(.+=)?(.+?);

(.+=)?(.+?)(?:;.+)

第二个捕获组具有我们想要的word2

Demo 1

Demo 2

示例1

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(.+=)?(.+?);";
        string input = @"word1=word2;word3
word2;word3";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

示例2

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(.+=)?(.+?)(?:;.+)";
        string substitution = @"$2";
        string input = @"word1=word2;word3
word2;word3";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}

答案 2 :(得分:0)

您可以使用String类方法解决问题,而不是使用常规表达式。

string[] words = str.Split(';');
string word2 = words[0].Substring(words[0].IndexOf('=') + 1);

第一行将行与';'分开。假设您只有一个';'该语句将您的行分为两个字符串。第二行从第一个出现的'='(words[0])字符的下一个字符(words[0].IndexOf('='))开始到末尾返回第一部分(+1)的子字符串。如果您的行没有任何'='字符,那么它只是从头开始,因为IndexOf返回-1。

相关文档: