^(((\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并且中断我的存储过程我将数据发送到。可接受的条目为2
或2x1
。
答案 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}
没用。我把它全部删除了。
.
如果您真的想要匹配一段时间,则需要进行转义(\.
我使用\s*
(0个或更多个空格字符)来确保它匹配尽管有尾随空格。您可能希望在开头添加一个。
我不确定你对所有捕获组做了什么。如果您不关心内部的内容,请考虑使用(?:)
代替()
。
编辑:根据您对所需内容的说明,尝试:
^(((\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后跟另一个数字,遵循与之前相同的模式。$
是字符串结尾的锚点