首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字符串有管道字符和冒号字符而没有转义时,什么是regex失败的?

当字符串有管道字符和冒号字符而没有转义时,什么是regex失败的?
EN

Stack Overflow用户
提问于 2017-08-01 19:40:33
回答 1查看 118关注 0票数 1

需求是构建一个Java正则表达式,允许所有字符(管道和冒号除外)在没有转义的情况下

代码语言:javascript
复制
|------|-----------------|
|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“
EN

回答 1

Stack Overflow用户

发布于 2017-08-01 19:46:09

您可以使用这个基于原子组的regex:

代码语言:javascript
复制
^(?>[^:|\\]|\\.)+$

RegEx演示

供Java使用:

代码语言:javascript
复制
final String regex = "^(?>[^:|\\\\\]|\\\\.)+$";

RegEx分手:

  • ^:开始
  • (?>:启动原子组
    • [^:|\\]:匹配任何不是|:\的字符
    • |:或
    • \\:匹配一个\
    • .:匹配\后面的下一个字符

  • )+:末端原子群。匹配这个组中的一个或多个直到结束。
  • $:结束

建议使用http://www.regular-expressions.info/atomic.html来避免回溯,以提高正则表达式的性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45446375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档