结合这些正则表达式

时间:2017-10-19 17:30:14

标签: ios regex

我有两个正则表达式:^(\\p{L}|[0-9]|_)+$#[^[:punct:][:space:]]+(第一个用于Java,第二个用于iOS)。我想将这些组合成一个表达式,以匹配iOS中的一个或另一个。 第一个用于用户名,因此我还需要在该用户的开头添加@字符。那会是什么样的?

1 个答案:

答案 0 :(得分:1)

Java中的^(\\p{L}|[0-9]|_)+$模式与iOS中使用的ICU库中的模式相同(它们非常相似):由1个或多个Unicode字母,ASCII数字或_组成的整个字符串。由于交替组是量化的,并且效率远低于基于字符类的解决方案^[\\p{L}0-9_]+$,因此写得很差。

#[^[:punct:][:space:]]+模式匹配#后跟1个或多个字符,而不是标点符号和空格字符(即1个或多个字母或数字,或字母数字字符)。

你所寻求的可以写成

@[\\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_]+ - 一个或多个Unicode字母,ASCII diigts,_
  • | - 或
  • # - #字符
  • [[:alnum:]]+ - 一个或多个字母或数字。
  • [^[:punct:][:space:]]+ - 标点/符号和空格以外的任何1个字符。

基本上,所有这些表达式documentation

如果您想完全匹配#SomeThing_123,只需使用[@#]\\w+@#,然后使用1个或多个字母,数字或_ ,或仅允许ASCII数字[@#][\\p{L}0-9_]+

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