2017-10-19 84 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如果您发现我的答案有帮助,请考虑将其加入。 –