我正在尝试使用正则表达式来匹配文件中具有重复部分单词的实例,其中单词需要匹配直到一个实例具有下划线 _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
可视化
注意事项
它看起来是重复的,因为它可以按任何顺序匹配,*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
可视化
代码
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/