c# - 如何匹配一个字符串,但前提是同一字符串尚未匹配或不匹配破折号?

标签 c# regex

我有一个案例,我正在尝试使用正则表达式进行匹配。

我当前的表达式将匹配带有或不带有破折号的特定格式的字符串。我想添加它以仅在之前未匹配字符串(有或没有破折号)的情况下进行匹配。例如,采取以下情况:

1.  1234-56-789-5555
2.  1234567895555
3.  0000-99-888-3333
4.  1111223334444

如果上面的四个示例以相同的顺序出现在列表、文档等中,我只想捕获 (1, 3, 4)。我想跳过 #2,因为它已经被 #1 捕获,但带有破折号。如果#2 先来,我会想同样跳过#1。

这是我当前使用的表达式:

\d\d\d\d-*\d\d-*\d\d\d-*\d\d\d\d

我试图阅读 look behinds(我对 Regex 相当缺乏经验),但我真正理解的是,look behind 仅检查某些文本之前是否匹配。我不确定我想要的是否可以与此结合;我只看到如何检查特定文本,而不是检查带/不带破折号的当前值。

我目前正在使用 C# 逻辑执行此操作,但我正在尝试查看它是否可以纯粹在 Regex 中完成。如果做不到,那也没关系;在这种情况下,我只是想加强我的 Regex 知识。

这可能吗——我怎样才能做到这一点?

最佳答案

如果您只想获取每个数字的第一次出现(回答我想跳过#2,因为它已经被#1 捕获,但带有破折号),您需要一个否定的外观-后面有一个RegexOptions.RightToLeftRegexOptions.Singleline选项:

(?<!\b\1-?\2-?\3-?\4\b.*)\b(\d{4})-?(\d{2})-?(\d{3})-?(\d{4})\b

\b(\d{4})-?(\d{2})-?(\d{3})-?(\d{4})\b subpattern 是带有捕获组的数字,用于检查它们是否存在,而不管字符串前面的连字符如何。

(?<!\b\1-?\2-?\3-?\4\b.*)子模式后视正在检查我们是否没有其他相同字符串的出现。

测试于 regexhero.net在 Expresso 中:

enter image description here

enter image description here

关于c# - 如何匹配一个字符串,但前提是同一字符串尚未匹配或不匹配破折号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130158/

相关文章:

c# - 在不创建新类的情况下反序列化字符串列表?

c# - 旋转边框不会改变窗口大小

.net - Intelligencia UrlRewriter 与 RegEx 无法正常工作

javascript - 在javascript中添加正则表达式来确定url后面是否有任何字符/

c# - Regex.Replace 中的 MatchEvaluator 如何工作?

c# - Entity Framework 过滤器 "Expression<Func<T, bool>>"

c# - 使用 Json.Net 的多态 JSON 反序列化失败

c# - WebJob 控制台应用程序中的 ProcessQueueMessage 函数

python - 如何在python中的字符串中搜索最后一次出现的正则表达式?

javascript - AngularJS 在模板上使用正则表达式替换