要求是构建一个Java正则表达式,以允许所有字符(不包括管道和冒号(在没有转义之前
|------|-----------------|
|Input | Expected output |
|------|-----------------|
|aaaaa | pass |
|------|-----------------|
|aaa: | fail |
|------|-----------------|
|aaa| | fail |
|------|-----------------|
|aaa: | pass |
|------|-----------------|
|: | fail |
|------|-----------------|
|: | pass |
|------|-----------------|
|\: | fail |
|------|-----------------|
|\: | pass |
|------|-----------------|
|\\ | pass |
|------|-----------------|
Tried following just for colon use-case - "(?<!\)(\\)*:"
行为在哪里
- 在":"和冒号前面是偶数返回时正确失败 斜线
正确传递冒号前面是奇数个反斜杠
错误地传递"aaa:aaa">
您可以使用这个基于原子组的正则表达式:
^(?>[^:|\]|\.)+$
正则表达式演示
对于 Java 使用:
final String regex = "^(?>[^:|\\]|\\.)+$";
正则表达式分解:
^
: 开始(?>
:启动原子组[^:|\]
:匹配任何不|
和:
和
字符|
: 或\
:匹配.
:匹配后的下一个字符
)+
: 结束原子组。匹配此组中的一个或多个直到结束。$
: 结束
建议使用原子组来避免回溯以提高正则表达式性能。