2017-10-19 70 views
2

我有兩個正則表達式:^(\\p{L}|[0-9]|_)+$#[^[:punct:][:space:]]+(第一個用於Java,第二個用於iOS)。我想將這些組合成一個表達式,以匹配iOS中的一個或另一個表達式。 第一個是用戶名,因此我還需要在該開頭添加一個@字符。那將是什麼樣子?合併這些正則表達式

+0

你的意思是在他們之間扔一個管道? (^(\\ p {L} | [0-9] | _)+ $)|(#[^ [:punct:] [:space:]] +) – sniperd

+0

我確實認爲要這樣做,但我不知道該美元符號是否適用於iOS,我在iOS中不擅長正則表達式。還有'@'符號會去哪裏?在'^'之前? – Tometoyou

+0

^表示該行的開頭,所以@會進入該行的右側。在iOS中$應該沒問題。給它一個鏡頭,如果它的作品我會寫一個完整的答案:) – sniperd

回答

1

Java中的^(\\p{L}|[0-9]|_)+$模式與iOS中使用的ICU庫中的模式相同(它們非常相似):由1個或多個Unicode字母,ASCII數字或_組成的整個字符串。由於交替組是量化的,寫得很差,並且比基於字符類的解決方案效率低得多,^[\\p{L}0-9_]+$

#[^[:punct:][:space:]]+模式與#匹配,後跟除標點/符號和空格字符(即1個或多個字母或數字或字母數字字符)之外的1個或多個字符。

你追求什麼可以writtern爲

@[\\p{L}0-9_]+|[^[:punct:][:space:]]+ 

@[\\p{L}0-9_]+|#[[:alnum:]]+ 

,或者如果你想限制爲ASCII數字,不符合Unicode的數字:

@[\\p{L}0-9_]+|#[\\p{L}0-9]+ 

它匹配

  • @ - 一個@
  • 符號
  • [\\p{L}0-9_]+ - 1以上Unicode字母,ASCII diigts,_
  • | - 或
  • # - 一個#
  • [[:alnum:]]+ - 1或多個字母或數字。
  • [^[:punct:][:space:]]+ - 除標點/符號和空格之外的任何1+字符。

基本上,所有這些表達式match strings like this

如果你想匹配全#SomeThing_123,只是用[@#]\\w+,一個@#,然後1個或多個字母,數字或_,或只允許ASCII數字,[@#][\\p{L}0-9_]+

模式末尾可能需要字邊界,[@#][\\p{L}0-9_]+\\b

+0

這是非常深入的,謝謝!爲我工作的是'@ [\ p {L} 0-9 _] + |#[^ [:punct:] [:space:]] +',因爲我需要使用像ı和ö這樣的特殊字符,但在#標籤中沒有'_'。 – Tometoyou

+0

@Tometoyou如果您發現我的答案有幫助,請考慮將其加入。 –