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

标签 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 个匹配的实例。

包含删除所有下划线,然后在正向/反向查找中匹配重复项几乎更有意义?

有点卡在如何做到这一点上

最佳答案

前言

虽然它是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
}

关于c# - 正则表达式,匹配部分单词,C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922883/

相关文章:

java - 正则表达式部分验证表达式

c# - 在C#中使用DbParameter将数据插入SQL Server

c# - 模拟管理系统?

regex - 替换字符串中每第 n 个字符实例

java - 替换打印流中的文本

java - 增强正则表达式以验证电话号码

javascript - 如何使用嵌套正则表达式

c# - 添加到 CHAR 列末尾的一系列空格

c# - 拳击,你喜欢什么,你认为哪个更快?

c# - 删除文件 vs 目录 + 重新创建性能