簡體   English   中英

如果-字符后只有空格,則正則表達式匹配失敗

[英]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} (與.相同)匹配任何字符。 在示例中,您要匹配一個點,因此應將其替換為\\.

就像是

^\d+\.\d+\.\d+(?:\s*-\s*[^\/\s]+)?\/\d+\.\d+\.\d+\.\d+?(?:\s*-\s*[^.\s]+)?\.\w+$

在regex101處檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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