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

标签 java regex

要求构建一个 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”

最佳答案

您可以使用这个基于原子组的正则表达式:

^(?>[^:|\\]|\\.)+$

RegEx Demo

对于 Java 使用:

final String regex = "^(?>[^:|\\\\\]|\\\\.)+$";

正则表达式分解:

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

建议使用atomic group 避免回溯以提高正则表达式性能。

关于java - 当字符串具有管道和冒号字符而不转义时,正则表达式会失败什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446375/

相关文章:

java - 为什么 IntelliJ 要我改变这个?

java - 由于 header 不正确,Sh 脚本未执行

javascript - JS 正则表达式 : how to match "for (...)" but not "for...of" or "for...in"

php - REGEX - PHP 仅获取字符串中的粗体部分

php - 缺少正则表达式变量

java - 有没有办法在 Criteria API 调用期间(本地)绕过或禁用 AttributeConverter?

java - 无法将 JSON 数据发送到其他 Android Activity

Java HttpURLConnection 无法连接到 ASP.NET API,连接被拒绝

JavaScript - 正则表达式信用卡到期日期自动格式

JavaScript onkeyup 正则表达式