2017-07-26 54 views
-2

我試圖創建一個正則表達式模式(一個或多個)。例如有SomeCamelStringToCombine它應該匹配以下子字符串:正則表達式匹配駱駝案例字符串的許多組合

Some, Camel, String, To, Combine, SomeCamel, SomeCamelString,SomeCamelStringTo, SomeCamelStringToCombine, CamelString, CamelStringTo, CamelStringToCombine, StringTo, StringToCombine, ToCombine

我設法創造這種模式:/(?=([\p{Lu}]+[\p{L}]+))/,但它匹配

SomeCamelStringToCombine, CamelStringToCombine, StringToCombine, ToCombine, Combine

我不知道我是否應該修改它或創建額外的模式。問題是我不知道如何。我正在使用Java進行匹配。

我可以問你一些幫助或提示嗎?

+0

的重複https://stackoverflow.com/questions/1128305/regular-expression-to-identify-camelcased-words-with-leading-uppercase-letter – Arpit

+1

@Arpit:我不這麼認爲,請仔細閱讀這個問題。 –

+1

我會在這裏出現一個肢體,並說你不能只用*正則表達式來完成。但是一個正則表達式能夠識別與一個循環結合在一起的(重新)創建組合應該足夠簡單。 –

回答

0

你可以製作一個固定大小的正則表達式來尋找高達那很多字的組合。
下面使用5個字的值得捕獲,但你可以擴展到任何大小。

您可以通過編程方式輕鬆創建正則表達式。

只是排除陣列中的捕獲組。

注意,第一場比賽後,您還可以排除1-5組,以避免
重複單打。

(?=([A-Z][a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)?([A-Z][a-z]+)?([A-Z][a-z]+)?)(?=(\1\2))(?=(\6\3)?)(?=(\7\4)?)(?=(\8\5)?)\1

https://regex101.com/r/ta9Qzq/1

(?= 
     ([A-Z] [a-z]+)    # (1), required Word 1 
     ([A-Z] [a-z]+)    # (2), required Word 2 
     ([A-Z] [a-z]+)?    # (3), optional Word 3 
     ([A-Z] [a-z]+)?    # (4), optional Word 4 
     ([A-Z] [a-z]+)?    # (5), optional Word 5 
) 
(?= 
     (\1 \2)      # (6), required Word 1,2 
) 
(?= 
     (\6 \3)?     # (7), optional Word 1,2,3 
) 
(?= 
     (\7 \4)?     # (8), optional Word 1,2,3,4 
) 
(?= 
     (\8 \5)?     # (9), optional Word 1,2,3,4,5 
) 
\1       # Advance position by 1 word 
+0

這是如何回答「例如有'SomeCamelStringToCombine'它應該匹配例如'CamelString',但不是'SomeString'」? – Andreas

+0

@Andreas - 在一個全局匹配中,它產生數組'Some,Camel,String,To,Combine,SomeCamel,SomeCamelString,SomeCamelStringTo,SomeCamelStringToCombine,CamelString,CamelStringTo,CamelStringToCombine,StringTo,StringToCombine,ToCombine'有什麼問題? https://開頭regex101。com/r/ta9Qzq/1 – sln

+0

猜猜我不明白這個問題。我仍然不確定。然而,你說*「它產生的數組」*,而不是。至少不是沒有額外的Java代碼來組合來自重複的find()調用的所有各種捕獲的組。你也可以說*「你可以將它擴展到任意大小」*,但這並不完全正確,因爲你可以將它擴展到任何*特定*最大大小,但不支持*任何*(無限)大小。 – Andreas

相關問題