正则表达式不起作用,为什么?

时间:2016-04-07 18:27:49

标签: regex

^(((\d{0,5}){1}|(\d{0,5}\.{1}(\d{0,5}){1})){1}[x]{1}((\d{0,5}){1}|(\d{0,5}\.{1}(\d{0,5}){1})){1})$

我希望正则表达式检查字符串是否正确 (整数/十进制)x(整数/十进制)或只有一个整数/十进制。当我输入2x或​​2.5x时我写的正则表达式,它应该是假的但它表示它是匹配的,即使它没有指定第二个整数/小数,即使有一个' x&# 39;,如果是2或2.5没有x那就没问题了。

我希望它接受的一些例子:

3x1
12345.123451x12345.12345
.12345x.12345
00000.12345x1
3
4.12345

我不希望它接受:

1x
1xx2
4fx34

我也不希望数字太大,这就是我到处都有{1}的原因。我想要的最大值是前5位数和小数后5位数。

然而,当我输入2x时,它在正则表达式上返回true并且中断我的存储过程我将数据发送到。可接受的条目为22x1

2 个答案:

答案 0 :(得分:0)

这个正则表达式除#2之外的所有符号都匹配,它有6个连续的数字:

^(((\d{0,5})|(\d{0,5}\.(\d{0,5})))[x ]((\d{0,5})|(\d{0,5}\.(\d{0,5}))))\s*$

  1. {1}没用。我把它全部删除了。

  2. .如果您真的想要匹配一段时间,则需要进行转义(\.

  3. 我使用\s*(0个或更多个空格字符)来确保它匹配尽管有尾随空格。您可能希望在开头添加一个。

  4. 我不确定你对所有捕获组做了什么。如果您不关心内部的内容,请考虑使用(?:)代替()

    编辑:根据您对所需内容的说明,尝试:

    ^(((\d{1,5}|\d{0,5}\.(\d{0,5})))(?:[x ]((\d{1,5}|\d{0,5}\.(\d{0,5})))))?\s*$

答案 1 :(得分:0)

嗯,你的正则表达式中有很多不必要的噪音,以及由于使用可以匹配空字符串的{0,5}而导致错误的空间很大。所以我做了一点改写,想出了

^(?>\d{0,5}\.\d{1,5}|\d{1,5})(?:x(?>\d{0,5}\.\d{1,5}|\d{1,5}))?$

首先请注意,如果没有真正需要限制为5位,您可以将{0,5}替换为*,将{1,5}替换为+。它也不会与你问题中的第二个例子相匹配,因为它在第一个数字中有6个十进制数字。

所以让我们分解一下:

  • ^是字符串开头的锚点
  • (?>\d{0,5}\.\d{1,5}|\d{1,5})是一个原子组,匹配0到5位,后跟一个点,后跟另一个1到5位(十进制数)或1到5位(整数)。我在这里使用了一个原子组,以避免在正则表达式匹配时不必要的回溯。
  • (?:x(?>\d{0,5}\.\d{1,5}|\d{1,5}))?是一个可选组,匹配字母x后跟另一个数字,遵循与之前相同的模式。
  • $是字符串结尾的锚点