[英]Regular expression match fails if only whitespace after the - character
我正在研究模式為的正則表達式:
1.0.0[ - optional description]/1.0.0.0[ - optional description].txt
[-可選說明]部分當然是可選的。 所以一些可能的有效值是
1.0.0/1.0.0.0.txt
1.0.0/1.0.0.0 - xyz.txt
1.0.0 - abc/1.0.0.0 - xyz.txt
1.0.0 - abc/1.0.0.0.txt
為了使模式匹配更可靠一些,我想在“-”字符前后匹配零個或多個空格。 因此,所有這些都是有效的。
1.0.0 - abc/1.0.0.0 - xyz.txt
1.0.0-abc/1.0.0.0-xyz.txt
1.0.0 -abc/1.0.0.0- xyz.txt
要進行此匹配,我具有以下正則表達式(Java代碼):
String part1 = "((\\d+.{1}\\d+.{1}\\d+)(\\s*-\\s*(.+))?)";
String part2 = "((\\d+.{1}\\d+.{1}\\d+.{1}\\d+)(\\s*-\\s*(.+))?\\.sql)";
pattern = Pattern.compile(part1+ "/" + part2);
到目前為止,此正則表達式運行良好。 但是當進行單元測試時,我發現一個案例我還不太清楚。 用例是如果包含“-”字符的字符串被1個或多個空格包圍,但是在“-”字符后沒有描述。 看起來像:
1.0.0 - /1.0.0.0.txt
1.0.0- /1.0.0.0-xyz.txt
在這些情況下,我希望模式匹配為FAIL。 但是用我當前的正則表達式,匹配成功了。 我想我想要的是,如果有一個“-”字符被任意數量的空格包圍,例如“-”,那么它后面也必須至少有一個非空格字符。 但是我不太清楚這個正則表達式。
謝謝!
就像是,
^\d+\.\d+\.\d+(?:\s*-\s*\w+)?\/\d+\.\d+\.\d+\.\d+(?:\s*-\s*\w+)?.txt$
或者,您可以將\\.\\d+
重復項組合為
^\d+(?:\.\d+){2}(?:\s*-\s*\w+)?\/\d+(?:\.\d+){3}(?:\s*-\s*\w+)?.txt$
變化
.{1}
如果您想重復一次,則不需要{}
。 其隱式
(?:\\s*-\\s*\\w+)
匹配零個或多個空格( \\s*
),后跟-
,另一個空格,然后\\w+
表示長度大於1的描述
?
在此模式的末尾使此選項成為可選。 ^
在字符串開頭錨定正則表達式。 $
將正則表達式固定在字符串的末尾。 這兩個是必需的,因此字符串中沒有其他內容。 ()
對模式進行分組。 這會導致內存浪費。 如果要對模式進行分組但不捕獲它們,請使用(?:..)
在與可選部分匹配的組中,您需要用\\\\S+
替換.+
,其中\\S
表示任何非空白字符。 這將強制可選部分包括非空格字符以匹配模式:
String part1
= "((\\d+\\.\\d+\\.\\d+)(\\s*-\\s*(\\S+))?)";
String part2
= "((\\d+\\.\\d+\\.\\d+.{1}\\d+)(\\s*-\\s*(\\S+))?\\.txt)";
另請注意, .{1}
(與.
相同)匹配任何字符。 在示例中,您要匹配一個點,因此應將其替換為\\.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.