首页 文章

Java表达式:不允许在中间使用单引号或允许使用双反斜杠的单引号

提问于
浏览
1

The format I want to validate

  • 从单引号开始(左侧修剪后)

  • 单引号结束(正确修剪后)

  • 中间:不允许单引号或允许它但必须使用双反斜杠进行转义

Samples

'abc' --> valid
'abc\\'def' --> valid
'abc'def' --> invalid

What I tried

public static void main(String[] args) {

    final Pattern pat = Pattern.compile("\\s*\\'[^']+\\'\\s*", Pattern.CASE_INSENSITIVE);

    System.out.println(pat.matcher("'abc'").matches());  // Out: true
    System.out.println(pat.matcher("'abc\\'def'").matches()); //Out: false, expected true
    System.out.println(pat.matcher("'abc'def'").matches()); // out false
}

I am having issue with this rule:

allow a single quote in middle but it must be escaped by \\

有帮助吗?谢谢!

2 回答

  • 1

    试试这个(“纯”正则表达式形式的可读性;需要在Java字符串中转义):

    \s*\'([^'\\]|\\')*\'\s*
    

    在字符串内部,我们接受任意数量的字符,这些字符不是 '\ ,或者恰好是转义序列 \' . 请注意,这将禁止在其他字符前面使用反斜杠,这就是转义字符通常的工作方式 . (我还建议使用 * rater而不是 + 以便允许空字符串 . )

  • 1

    你需要

    final Pattern pat = Pattern.compile("\\s*'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'\\s*");
    

    Java demo .

    细节:

    • \s* - 0个空格

    • ' - 单引号

    • [^'\\]* - 除了 '\ 之外的0个字符

    • (?:\\.[^'\\]*)* - 零个或多个序列

    • \\. - 除了linebreak char之外的任何转义字符(添加 Pattern.DOTALL 以匹配任何字符包含换行符)

    • [^'\\]* - 除了 '\ 之外的0个字符

    • ' - 单引号

    • \s* - 0个空格

相关问题