正则表达式,匹配部分单词,C#

时间:2015-11-25 17:29:19

标签: c# regex

我试图使用正则表达式来匹配文件中具有重复部分单词的实例,其中单词需要匹配,直到一个实例具有下划线_Id,而另一个实例是部分匹配这个词。

类似于:

正在使用的正则表达式是:/^(\S+) (?=(?s:.)*\1.*).*

public Guid? Something_Id { get; set;}
public Guid? SomethingId {get; set;}

public Guid? AnotherProp_Id { get; set;}
public Guid? AnotherPropId { get; set; }

这应该返回2个匹配的实例。

几乎更有意义的是为所有下划线包含一个删除,然后在前进/后退查找中匹配重复项?

有点坚持怎么做

1 个答案:

答案 0 :(得分:0)

彰扬

虽然correctly highlighted via a comment RegEx可能不是最佳解决方案,但这个答案提供了一个RegEx解决方案。

正则表达式

(?:
  ^[^\r\n]+?\b(\S+)_Id\b[^\r\n]+.*?
  ^[^\r\n]+?\b(?:\1)Id\b
|
  ^[^\r\n]+?\b(\S+)Id\b[^\r\n]+.*?
  ^[^\r\n]+?\b(?:\2)_Id\b
)

https://regex101.com/r/iC9qK5/1

可视化

Regular expression visualization

备注

它看起来重复,因为它可以按任何顺序匹配,*Id然后*_Id*_Id然后*Id

这也允许任何东西在它们之间的界限。

代码

try {
    Regex regexObj = new Regex(
        @"(?:
          ^[^\r\n]+?\b(\S+)_Id\b[^\r\n]+.*?
          ^[^\r\n]+?\b(?:\1)Id\b
        |
          ^[^\r\n]+?\b(\S+)Id\b[^\r\n]+.*?
          ^[^\r\n]+?\b(?:\2)_Id\b
        )", 
        RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Multiline);
    Match matchResults = regexObj.Match(subjectString);
    while (matchResults.Success) {
        // matched text: matchResults.Value
        // match start: matchResults.Index
        // match length: matchResults.Length
        matchResults = matchResults.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

第2部分:删除罪犯

如果这适合您 - 您可以使用略微修改的版本执行替换

正则表达式

(?:
  (^[^\r\n]+?\b(\S+)_Id\b[^\r\n]+(.*?))
  (^[^\r\n]+?\b(?:\2)Id\b)[^\r\n]+\r?\n
|
  (\r?\n^[^\r\n]+?\b(\S+)Id\b[^\r\n]+)(.*?)
  (^[^\r\n]+?\b(?:\6)_Id\b)[^\r\n]+
)

https://regex101.com/r/iC9qK5/2

替换

$1$7$8

可视化

Regular expression visualization

代码

string resultString = null;
try {
    resultString = Regex.Replace(subjectString, 
        @"(?:
          (^[^\r\n]+?\b(\S+)_Id\b[^\r\n]+(.*?))
          (^[^\r\n]+?\b(?:\2)Id\b)[^\r\n]+\r?\n
        |
          (\r?\n^[^\r\n]+?\b(\S+)Id\b[^\r\n]+)(.*?)
          (^[^\r\n]+?\b(?:\6)_Id\b)[^\r\n]+
        )", 
        "$1$7$8", RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Multiline);
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}