2017-08-01 30 views
1

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

+2

为什么第四个('aaa:')通过,第二个(也是'aaa:')是否失败? – Andreas

回答

2

您可以使用此原子团基于正则表达式:

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

RegEx Demo

对于Java使用:

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

正则表达式解体:

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

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

+0

谢谢!如果前面有多个反斜杠,则除外。如果前面是2(偶数)反斜杠,测试应该失败,而3(添加)反斜杠测试应该通过。 –

+0

是的,我的意思是看后面。我们期待保留[:|]的序列化字符串。如果是,则:|被使用,他们应该逃脱。 –

+0

太棒了。感谢您更新的正则表达式!我相信除了“\\\\”之外,所有情况都会通过。 –

相关问题