当字符串具有管道和冒号字符而不转义时,正则表达式会失败吗?



要求是构建一个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 = "^(?>[^:|\\]|\\.)+$";

正则表达式分解:

  • ^: 开始
  • (?>:启动原子组
    • [^:|\]:匹配任何不|:
    • 字符
    • |: 或
    • \:匹配
    • .:匹配后的下一个字符
  • )+: 结束原子组。匹配此组中的一个或多个直到结束。
  • $: 结束

建议使用原子组避免回溯以提高正则表达式性能。

最新更新