[英]Regular expression, match a partial word, C#
我正在尝试使用正则表达式来匹配在文件中具有重复的部分单词的实例,其中该单词需要匹配,直到一个实例带有下划线_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个匹配的实例。
将所有下划线都包括在内,然后在向前/向后查找中匹配重复项,几乎是更有意义的做法?
有点卡住了怎么做
尽管已通过注释正确突出显示了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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.