[英]Regular expression to match line separated size strings
我正在編寫一個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] $
您的初始正則表達式由於+
而“失敗”:
^(\d+x\d+[\r\n|\r|\n]*)+$
-----------------------^ here
您的括號模式( \\d+x\\d+[\\r\\n|\\r|\\n]*
)表示匹配一個或多個數字,后跟一個“ x”,然后是一個或多個數字,然后是零個或多個換行符 。 在+
后,說比賽的一個或多個整個括號模式 ,這意味着對於像輸入 100x200x300
你的模式匹配100x200
,然后200x300
,所以它看起來像它的整條生產線相匹配。
如果您只是嘗試從換行符分隔的字符串中提取尺寸,則可以將以下正則表達式與多行標志一起使用:
^(\d+x\d+)$
https://regex101.com/r/H9JDjA/2
旁注:在您的表達式中, [\\r\\n|\\r|\\n]
實際上是說匹配\\r
, \\n
, |
任何一個實例。 , \\r
, |
或\\n
(即,這是多余的,並且您可能不希望匹配|
)。 如果要匹配\\r
或\\n
任意組合的順序集,只需使用[\\r\\n]+
。
使用此目標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
來自(?:\\ d + x \\ d +)*的 0x200
因此,這就是為什么第一個正則表達式似乎匹配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 )*
$
您可以使用多行修飾符,這會使生活更輕松:
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
試試這個正則表達式
^[0-9]{1,4}x[0-9]{1,4}|[(\\r\\n|\\r|\\n)]+$
它將匹配這些輸入。
1x1
10x10
100x100
2000x2938
\\n
\\r
\\r\\n
但不是100x100x200
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.