正则表达式允许字符模式,但不允许来自该模式的单个字符

时间:2017-06-07 20:31:19

标签: java regex string

我正在尝试创建一个将执行以下操作的正则表达式

匹配字符串if:

  • 字符串介于4-35个字符之间
  • String必须包含$作为String
  • 中的最后一个char
  • 除非美元符号包含在括号内,即$
  • ,否则字符串在其他地方不包含任何[$]

我目前有以下正则表达式:[^\$]{3,34}\$$

您可以看到示例here

除了最后,这不会允许$,但如果它被括在[$]括号中,我仍然需要允许美元符号。如何添加“允许”[$]的方法?

一些正面示例:

  • ABCD $
  • ABC [$] d $
  • [$] ABCDEFG $
  • @#%^&安培; * [$] ^%$

一些否定示例:

  • AB $ CD
  • ABCD
  • $$ ABCD $
  • AB $ [$] CD $

1 个答案:

答案 0 :(得分:3)

您可以使用

^(?=.{4,35}$)(?:\[\$]|[^$])*\$$

请参阅regex demo

<强>详情:

  • ^ - 字符串的开头(如果模式与matches()一起使用,则可省略)
  • (?=.{4,35}$) - 字符串中需要4到35个字符的正向前瞻
  • (?:\[\$]|[^$])* - 0 + [$]个子字符串或$以外的任何字符
  • \$ - 文字$
  • $ - 字符串结尾(如果与matches()一起使用,则可以省略)。

Java demo

String lines[]  = {"ABCD$","ABC[$]D$","[$]ABCDEFG$","!@#%^&*[$]^%$","AB$CD","ABCD","$$ABCD$","AB$[$]CD$"};
String pat = "(?=.{4,35}$)(?:\\[\\$]|[^$])*\\$";
for(String line : lines)
{
    System.out.println(line + ": " + line.matches(pat));
}

结果:

ABCD$: true
ABC[$]D$: true
[$]ABCDEFG$: true
!@#%^&*[$]^%$: true
AB$CD: false
ABCD: false
$$ABCD$: false
AB$[$]CD$: false