正则表达式匹配行分隔的大小字符串

时间:2017-10-24 17:43:17

标签: javascript php node.js regex

我正在编写一个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)+$

我的问题:

  1. 为什么没有单词边界的初始正则表达式会失败?看起来我匹配\ d +(数字)的一个或多个实例,后跟字符'x',后跟\ d +(数字),后跟来自各种操作系统的一个或多个新行。
  2. 如何在此输入中验证具有多个训练新行字符的输入?以下内容不适用于某种类型的输入:

    500×500 \ n100x100 \ n \ n \ n384384

    ^(\ d + X \ d + [\ r \ N | \ r | \ n]的 \ B)+ | [\ r \ N | \ r | \ n]的 $

4 个答案:

答案 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让它匹配。

来自 \ d + x \ d +

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