Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何匹配字符串,但仅当同一字符串尚未匹配带破折号或不带破折号时才匹配?_C#_Regex - Fatal编程技术网

C# 如何匹配字符串,但仅当同一字符串尚未匹配带破折号或不带破折号时才匹配?

C# 如何匹配字符串,但仅当同一字符串尚未匹配带破折号或不带破折号时才匹配?,c#,regex,C#,Regex,我想用正则表达式匹配一个案例 我的当前表达式将匹配特定格式的字符串(带破折号或不带破折号)。我只想在字符串之前没有匹配过的情况下将其添加为匹配,无论是否使用破折号。例如,以以下情况为例: 1. 1234-56-789-5555 2. 1234567895555 3. 0000-99-888-3333 4. 1111223334444 如果上面的四个示例以相同的顺序出现在列表、文档中,那么我只想捕获(1、3、4)。我想跳过#2,因为它已被#1捕获,但带有破折号。如果#2排在第一位,我也会

我想用正则表达式匹配一个案例

我的当前表达式将匹配特定格式的字符串(带破折号或不带破折号)。我只想在字符串之前没有匹配过的情况下将其添加为匹配,无论是否使用破折号。例如,以以下情况为例:

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

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

我目前正在用C#logic来做这件事,但我想看看是否可以用正则表达式来做。如果做不到,那没关系;在这种情况下,我只是想加强我的正则表达式知识


这可能吗?我如何才能做到这一点呢?

您可以轻松地做到这一点,而无需使用正则表达式。。但是如果你仍然想使用正则表达式来实现这个目的。。您可以使用以下选项进行匹配:

(?<=((\d{4})-(\d{2})-(\d{3})-(\d{4})).*?)\2\3\4\5

(?您可以使用以下正则表达式完全执行您想要的操作

((?<=((\d{4})-(\d{2})-(\d{3})-(\d{4})).*?)(?!\3\4\5\6)\d{13})|(((?<=((\d{4})(\d{2})(\d{3})(\d{4})).*?)(?!\10-\11-\12-\13)((\d{4})-(\d{2})-(\d{3})-(\d{4}))))

(?如果您只想获得每个数字的第一次出现(回答我想跳过#2,因为它已被#1捕获,但带有破折号),则需要使用
RegexOptions.rightoleft
RegexOptions.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
子模式是带有捕获组的数字,用于检查它们是否存在,而不管字符串中前面的连字符是什么

(?子模式look-behind正在检查是否没有其他相同字符串出现

在Expresso进行测试:


你需要一些
C#
逻辑来实现这一点。可以很容易地从字符串中删除所有破折号,并获取唯一的破折号,完全跳过正则表达式。如果这是你的实际数据,还有什么其他匹配条件和限制?也许你可以一起避免正则表达式。至于跳过已经匹配的项,你只需要d要去掉代码中的破折号并检查您现有的集合是否已经包含该字符串,如果没有,请添加它。我已经在使用C#logic来检查这一点——只是想知道是否可以纯粹使用正则表达式来完成。匹配时当然可以去掉破折号,但不能仅在单个正则表达式中指示它不匹配字符串,因为它们是不匹配的在文档的前面已经匹配了,破折号与否。+1与IREAL所说的一致…不管怎样,您都需要将任何新字符串与集合中现有的字符串进行比较,以查看是否已经匹配exists@stribizhev感谢您指出错误。我相信可以使用正则表达式完成(可能是错误的)…请检查更新的正则表达式:)