我试图使用正则表达式来匹配文件中具有重复部分单词的实例,其中单词需要匹配,直到一个实例具有下划线_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个匹配的实例。
几乎更有意义的是为所有下划线包含一个删除,然后在前进/后退查找中匹配重复项?
有点坚持怎么做
答案 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
它看起来重复,因为它可以按任何顺序匹配,*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
}
如果这适合您 - 您可以使用略微修改的版本执行替换
(?:
(^[^\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
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
}