要求构建一个 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 = "^(?>[^:|\\\\\]|\\\\.)+$";
正则表达式分解:
^
:开始(?>
: 启动原子组[^:|\\]
:匹配除|
和:
和\
之外的任何字符|
:或\\
:匹配\
.
:匹配\
之后的下一个字符
)+
:结束原子组。匹配该组中的一个或多个直到结束。$
:结束
建议使用atomic group 避免回溯以提高正则表达式性能。
关于java - 当字符串具有管道和冒号字符而不转义时,正则表达式会失败什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446375/