[英]Java 8 regex: a capturing group in a pattern doesn't match, yet the whole pattern does match
這是我的第一個問題。 很高興與大家見面。
我在 Java 8 中創建了以下正則表達式模式(為了清楚起見,這只是我在代碼中實際擁有的內容的一個簡化示例):
(?<!a)([0-9])\,([0-9])(?!a)|(?<!b)([0-9]) ([0-9])(?!b)|(?<!c)([0-9])([0-9])(?!c)
所以一般來說它由三個選項組成:第一個匹配兩個用逗號分隔的單個數字,例如:
1,1
2,0
4,5
第二個匹配兩個用空格分隔的單個數字,例如:
1 1
2 0
4 5
第三個匹配一行中的兩個單個數字,例如:
11
20
45
每個替代方案都使用環視,並且它們中的每一個都必須略有不同 - 這就是為什么我不能像這樣將所有東西放在一起:
([0-9])[, ]?([0-9])
每個匹配的數字都包含在一個捕獲組中,現在我有第二行來“調用”這些捕獲的數字,如下所示:
(?<!n)($1 $2|$3 $4|$5 $6)(?!n)
所以最后我需要匹配一個文本,該文本具有相同的數字,用單個空格分隔,而不是用“n”包圍。 因此,如果上面顯示的任何示例與第一行的模式匹配,則第二行模式應與這些匹配:
1 1
2 0
4 5
11 11
22 00
44 55
而不是這些:
n1 1
2,0
45
asd asd asd
問題如下:即使我在測試文本中沒有這些捕獲的數字,它也會返回匹配項,但我確實有空格......所以在這里我沒有得到匹配項,這是正確的:
aaaaaaaaa
bbbbbbbbb
aasdfasdf
但在這里我在以下方面得到了匹配(最明顯的是因為有一個/多個空格):
abc abc
q w r t y
as df
有誰知道這是否正常,盡管捕獲組中的字符沒有被第一行捕獲,但“非捕獲組”部分(因此是單個空格)將被匹配,因此整個模式返回匹配,如如果第一行沒有捕獲任何內容,捕獲組是否可以是第二行中的零長度匹配? 預先感謝您對此的任何評論。
您的正則表達式匹配空格,因為1,1
字符串的結果模式是(?<!n)(1 1| | )(?!n)
,並且它可以匹配前面或后面都沒有空格的空格。
當替換反向引用不匹配.replaceAll
/ .replaceFirst
中的任何字符串時,它會被分配一個空字符串(使用.find()
/ .matches()
時它被分配為null ),因此您仍然會在結果模式。
您可以通過在字符串替換模式中連接替換反向引用來利用此功能以及每個替代項恰好有兩個捕獲組的事實,從而完全擺脫交替:
搜索: (?<!a)([0-9]),([0-9])(?!a)|(?<!b)([0-9]) ([0-9])(?!b)|(?<!c)([0-9])([0-9])(?!c)
替換: (?<!n)($1 $2|$3 $4|$5 $6)(?!n)
請注意反向引用是如何連接的:首先是對奇數組的所有反向引用,然后是對偶數組的所有反向引用都放置在無替代模式中。
請參閱正則表達式演示。
請注意,即使不同備選方案的組數不同,您也可以向每個組添加“假”空組,這種方法仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.