如果仅重复一组符号,如何使正则表达式匹配?

Posted

技术标签:

【中文标题】如果仅重复一组符号,如何使正则表达式匹配?【英文标题】:How to make regular expression match if a group of symbols is repeated only? 【发布时间】:2013-11-22 18:09:39 【问题描述】:

我需要一个可以匹配日期的正则表达式。但是,日、月和年的分隔符可能不同。它可能是一个点、一个破折号、一个斜线......

我拥有的是

^([012]?[1-9]|3[01])[\\.\\-\\/\\\\](0?[1-9]|1[012])[\\.\\-\\/\\\\](19|20)\\d2$

原来如此

([012]?[1-9]|3[01]) --the day part
(0?[1-9]|1[012])    --the month part
(19|20)\\d2       --the year part

分隔符重复两次,根据我当前的表达式[\\.\\-\\/\\\\],可能会有所不同...我的意思是,它匹配,比如说:

01.01-1986

虽然我希望它仅在有两个点、两个破折号或两个分隔符部分允许的情况下才匹配...所以上面给出的示例不应该匹配。

我想它可以通过正则表达式的分组模式以某种方式完成。但我不知道如何应用它。另外我发现自己完全不知道如何用谷歌搜索这个......

谁能把我推向正确的方向?


PS:我最近看了SO Regular Expression to match valid dates...在我的情况下,我明白它会匹配没有它的月份的第 31 天,以及 2 月缺席的所有日子...一切都好...


在 Java 中,我目前使用以下代码:

String value = "31/12/2086";
String pattern = ...
boolean result = value.matches(pattern);

在 C# 中

string value = "01.01.2014";
string pattern = "";
bool result = Regex.IsMatch(value, pattern);

如果有办法做我想做的事,如果该解决方案适用于这两种语言,那就太好了...Are Java and C# regular expressions compatible?

【问题讨论】:

【参考方案1】:

您可以在正则表达式中使用\\x,其中x 是组号。它表示与组x 匹配的相同字符串。所以在你的情况下,你可以使用类似的东西

someRegex([.\\-/\\\\])someOtherRegex\\1anotherRegex
          ^^^^^^^^^^^               ^^^
            group 1                 here should appear same string as in group 1

例子

String regex = "someRegex([.\\-/\\\\])someOtherRegex\\1anotherRegex";
System.out.println("someRegex.someOtherRegex.anotherRegex".matches(regex));
System.out.println("someRegex.someOtherRegex-anotherRegex".matches(regex));
System.out.println("someRegex-someOtherRegex-anotherRegex".matches(regex));

输出:

true
false
true

【讨论】:

谢谢!这正是我所需要的 当你接受我的回答时我就是这么想的 :) 无论如何我很高兴你喜欢它 :D

以上是关于如果仅重复一组符号,如何使正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式仅匹配美元符号、货币、小数

正则表达式特殊符号及用法

如何仅匹配两个点之间的数字,不包括使用正则表达式的点[重复]

正则表达式仅匹配匹配组 1 中日期的最后一部分 [重复]

如何使我的正则表达式匹配我的文本中的任何类型的 str [重复]

正则表达式:如何使范围匹配最小可能长度?