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