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

时间:2016-10-27 16:46:53

标签: java regex

我要验证的格式

  1. 从单引号开始(左侧修剪后)
  2. 以单引号结束(右边修剪后)
  3. 中间:不允许单引号或允许它,但必须使用双反斜杠
  4. 进行转义

    样品

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

    我尝试了什么

    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
    }
    

    我对此规则有疑问:

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

    有什么帮助吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

你需要

ArrayList

请参阅Java demo

详细

  • final Pattern pat = Pattern.compile("\\s*'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'\\s*"); - 0+ whitespaces
  • \s* - 单引号
  • ' - 除[^'\\]*'
  • 以外的0个字符
  • \ - 零个或多个序列
    • (?:\\.[^'\\]*)* - 除了换行符之外的任何转义字符(添加\\.以匹配任何字符串换行符)
    • Pattern.DOTALL - 除[^'\\]*'
    • 以外的0个字符
  • \ - 单引号
  • ' - 0+ whitespaces