簡體   English   中英

正則表達式以匹配行分隔的大小字符串

[英]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)+$

我的問題:

  1. 為什么沒有單詞邊界的初始正則表達式會失敗? 看來我正在匹配\\ d +(number)的一個或多個實例,后跟字符'x',然后是\\ d +(number),然后是來自各種操作系統的一個或多個新行。
  2. 如何驗證輸入中具有多個訓練換行符的輸入? 以下不適用於此類輸入:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM