我正在尝试匹配其中包含非数字的数字字符串。使用http://regexr.com/中的默认文本,以下内容应匹配:
v2.1
-98.7
3.141
.6180
9,000
+42
555.123.4567
+1-(800)-555-2468
以下不匹配:
0123456789
12345
我试过了:
/[^\n\ ]{1,}\d+\S+\d/g
但它与+42
不匹配且与0123456789
和12345
不匹配,并将"555.123.4567 +1-(800)-555-2468"
视为一个字符串。
我尝试通过在末尾放置一个$
来缓解它,但没有任何匹配。不确定我做错了什么。
答案 0 :(得分:2)
您可以使用此正则表达式匹配任何至少有一个非数字的文本:
/^\d*[^\d\n]+\d.*$/mg
RegEx分手:
^
- 开始\d*
- 匹配0位或更多位数[^\d\n]+
- 匹配任何不是数字且不是换行符的字符中的1个或多个\d
- 匹配数字.*
- 匹配任何字符的0或更多$
- 结束答案 1 :(得分:0)
试试这个:
^(?=.*\d)(?=.*[^\d\s])\S+$
这意味着“至少有一个数字,一个非数字,没有空格”。
请参阅live demo。
如果您的输入中没有换行符,则可以稍微简单一些:
^(?=.*\d)(?=.*\D)\S+$
答案 2 :(得分:0)
看起来你想要躲避完全由数字或完全由字母组成的字符串。所以你可以排除这些。这也将在没有任何数字的字符串中出现,因此也需要一个数字。
my $exclude = qr/(?: [0-9]+ | [A-Za-z]+ )/x;
my @res = grep { not /^$exclude$/ and /\d/ } @strings;
如果需要排除任何其他字符(下划线?),请将其添加到列表中。
目前尚不清楚你的输入是如何产生的,这需要一个准备好的字符串列表。添加单词边界和/或/s
,具体取决于输入。或者将输入解析为字符串列表。
如果输入来自多行字符串my @strings = split '\n|\s+', $text;
。
答案 3 :(得分:0)
你是不是大概过度思考?使用/\D/
匹配包含非数字的字符串有什么问题?
我不确定您的具体要求是什么,但如果您要查找的字符串至少包含一位数字且至少包含一位非数字,那么最简单的方法是使用正则表达式匹配 - {{ 1}}。
/\d/ && /\D/