特定数字前缀的正则表达式

时间:2011-03-13 11:25:24

标签: java regex

我正在尝试使用以下regx规则,但无法找到解决方案。

如果我没说清楚,我很抱歉。我希望每个规则都有不同的regx。我正在使用Java。

  • 规则应该失败所有数字输入都以前缀'1900'或'1901'开头。 (190011 - 失败,190111 - 失败,41900 - 成功......)

  • 规则应该成功,所有数字输入前缀为'*'

每个规则的不同正则表达式(我不是在一起寻找它们的组合)

2 个答案:

答案 0 :(得分:1)

这个RE符合目的吗? :

'\A(\*|(?!190[01])).*'

\ A表示'字符串的开头'。我认为Java的正则表达式是一样的

修改

\A:“从字符串的最开始......”。在Python(实际上是我所知道的)中,如果我们使用始终从头开始分析的函数match()而不是在字符串中的任何地方搜索的search(),则可以省略这一点。如果您希望正则表达式能够从每行的最开始分析行,则必须将其替换为^

(...|...):“......必须有以下两个选项之一:......”

\*:“......第一个选项只有一个字符,一个明星; ......”。由于星形是特殊字符,意思是'零,是正则表达式字符串中'之前的一倍或多倍,它必须被转义为严格意味着'明星'。< / p>

(?!190[01]):“......第二个选项不是必须找到并且可能被捕获的模式,而是必须缺少的模式(仍然在最开始之后)......”。两个字符?!表示'不得包含以下字符。找不到的模式是4个整数字符长,'1900''1901'

(?!.......)是一个负前瞻性断言。所有类型的断言都以(?开头:括号使?的习惯含义无效,这就是所有断言总是用括号写的原因。

如果\*匹配,则消耗了一个字符。相反,如果断言被验证,则字符串的相应4个第一个字符尚未被消耗:正则表达式电机已经通过分析的字符串直到第4个字符来验证它们,然后它又回到了它的初始状态位置,也就是说,现在,在字符串的最开头。

如果您希望双可选部分(...|...)不是捕获组,您将在第一个paren之后写?:,然后'\A(?:\*|(?!190[01])).*'

.*:在开始模式(一个星形捕获/匹配,或断言验证)之后,正则表达式电机继续捕获所有字符,直到行尾。如果字符串有换行符,并且您希望正则表达式捕获所有字符,直到字符串结尾,而不仅仅是一行,您将指定.也必须匹配换行符(在Python中它与re .MULTILINE),或者您将.*替换为(.|\r|\n)*

我终于明白你显然想要捕捉由数字字符组成的字符串。如果是,则RE必须更改为'\A(?:\*|(?!190[01]))\d*'。此RE与空字符串匹配。如果您希望与空字符串不匹配,请将\d+替换为\d*。如果你只想要那个至少有一个数字的字符串,即使是星号开头的星号匹配,那就做'\A(?:\*|(?!190[01]))(?=\d)\d*'

答案 1 :(得分:0)

对于第一条规则,您应该使用带有两个捕获的组合正则表达式,一个捕获1900/1901前缀的情况,另一个捕获其余的捕获。然后,您可以通过检查两个捕获来确定字符串是成功还是失败:

(190[01]\d+)|(\d+)

或者只是一个简单的190[01]\d+并否定你的逻辑。

正则表达式并不是非常善于排除某些东西。

您可以使用负面后卫排除前缀,但在这种情况下它不起作用,因为前缀本身就是数字流。

您似乎试图在美国排除1-900 / 901电话号码。如果位数是明确的,您可以使用负面后卫来排除此前缀,同时匹配剩余的确切数字位数。

对于第二条规则,只需:

\*\d+