我正在编写一个reular表达式来验证输入字符串,这是一个以行分隔的大小列表([width] x [height])。
有效输入示例:
300x200
50x80
100x100
我最初提出的正则表达式是(https://regex101.com/r/H9JDjA/1):
^(\d+x\d+[\r\n|\r|\n]*)+$
此正则表达式与我的输入匹配,但也匹配此无效输入(大小不能为100x100x200):
300x200
50x80
100x100x200
在最后添加一个单词边界似乎解决了这个问题:
^(\d+x\d+[\r\n|\r|\n]*\b)+$
我的问题:
如何在此输入中验证具有多个训练新行字符的输入?以下内容不适用于某种类型的输入:
500×500 \ n100x100 \ n \ n \ n384384
^(\ d + X \ d + [\ r \ N | \ r | \ n]的 \ B)+ | [\ r \ N | \ r | \ n]的 $
答案 0 :(得分:1)
您的初始正则表达式"失败"因为+
:
^(\d+x\d+[\r\n|\r|\n]*)+$
-----------------------^ here
您的括号模式(\d+x\d+[\r\n|\r|\n]*
)表示匹配一个或多个数字后跟" x"后跟一个或多个数字,后跟零个或多个换行符。之后的+
表示匹配整个括号模式中的一个或多个,这意味着对于100x200x300
之类的输入,您的模式与100x200
匹配,然后{{ 1}},所以看起来它匹配整行。
如果您只是尝试从换行符分隔的字符串中提取维度,我会使用以下带有多行标记的正则表达式:
200x300
https://regex101.com/r/H9JDjA/2
附注:在您的表达式中,^(\d+x\d+)$
实际上是在说明匹配[\r\n|\r|\n]
,\r
,\n
,|
的任何一个实例, \r
或|
(即它非常多余,您可能并不意味着匹配\n
)。如果您想匹配|
或\r
的任意组合的顺序集,您只需使用\n
。
答案 1 :(得分:1)
使用此目标100x100x200
现在,忘记正则表达式中的锚点。
最小正则表达式是\d+x\d+
,因为它只需要满足一次
比赛进行。
最大值类似于\d+x\d+ (?: (?:\r?\n | \r)* \d+x\d+ )*
由于\r?\n|\r
是可选的,因此可以将其缩减为此\d+x\d+ (?: \d+x\d+ )*
当您应用于目标字符串时,结果为:
100x100
x200匹配。
但是,既然你已经锚定正则表达式^$
,它就会被迫中断
中间的100让它匹配。
100x10
来自的0x200
(?:\ d + x \ d +)*
所以,这就是第一个正则表达式似乎匹配100x100x200
的原因。
要避免所有这些,只需要在它们之间换行,并且
使尾随换行符可选(如果您需要验证整个换行符
字符串,否则将其关闭并结束锚。)
^\d+x\d+(?:(?:\r?\n|\r)+\d+x\d+)*(?:\r?\n|\r)*$
更好地了解它
^
\d+ x \d+
(?:
(?: \r? \n | \r )+
\d+ x \d+
)*
(?: \r? \n | \r )*
$
答案 2 :(得分:0)
您可以使用多线修改器,这会让生活更轻松:
var input = "\n\
300x200x400\n\
50x80\n\
\n\
\n\
300x200\n\
50x80\n\
100x100x200x100\n";
var allSizes = input.match(/^\d+x\d+/gm); // multiline modifier assumes each line has start and end
for (var size in allSizes)
console.log(allSizes[size]);
打印:
300x200
50x80
300x200
50x80
100x100
答案 3 :(得分:-1)
试试这个正则表达式
^[0-9]{1,4}x[0-9]{1,4}|[(\r\n|\r|\n)]+$
它会匹配这些输入。
1x1
10x10
100x100
2000x2938
\n
\r
\r\n
但不是100x100x200