使用lookahead匹配以引号开头和结尾的字符串并删除引号?

时间:2017-06-07 03:16:18

标签: java regex

我希望匹配以相同引号开头和结尾的字符串,但只匹配开头和结尾的引号:

"foo bar"
'foo bar'
"the quick brown fox"

但我不希望这些匹配或剥离:

foo "bar"
foo 'bar'
'foo bar"
"the lazy" dogs

我尝试使用这个java regexp,但它并不适用于所有情况:

Pattern.compile("^\"|^'(.+)\"$|'$").matcher(quotedString).replaceAll("");

我认为有一种方法可以做前瞻,但在这种情况下我不知道如何使用它。

或者设置一个单独检查它们的if语句会更有效吗?

Pattern startPattern = Pattern.compile("^\"|^');
Pattern endPattern = Pattern.compile(\"$|'$");

if (startPattern.matcher(s).find() && endPattern.matcher(s).find()) {
    ...
}

(当然,这将匹配'foo bar",我不想要)

2 个答案:

答案 0 :(得分:3)

你正在寻找的正则表达式是

^(["'])(.*)\1$

替换字符串为"$2"

Pattern pattern = Pattern.compile("^([\"'])(.*)\\1$");
String output = pattern.matcher(input).replaceAll("$2");

演示:https://ideone.com/3a5PET

答案 1 :(得分:2)

这是一种可以检查所有要求的方法:

public static boolean matches (final String str)
{
    boolean matches = false;

    // check for null string
    if (str == null) return false;

    if ((str.startsWith("\"") && str.endsWith("\"")) || 
        (str.startsWith("\'") && str.endsWith("\'")))
    {
        String strip = str.substring(1, str.length() - 1);

        // make sure the stripped string does not have a quote
        if (strip.indexOf("\"") == -1 && strip.indexOf("\'") == -1)
        {
            matches = true;
        }
    }
    return matches;
}

<强>测试

public static void main(String[] args)
{
    System.out.println("Should Pass\n-----------");
    System.out.println(matches("\"foo bar\""));
    System.out.println(matches("\'foo bar\'"));
    System.out.println(matches("\"the quick brown fox\""));

    System.out.println("\nShould Fail\n-----------");
    System.out.println(matches("foo \"bar\""));
    System.out.println(matches("foo \'bar\'"));
    System.out.println(matches("'foo bar\""));
    System.out.println(matches("\"the lazy\" dogs"));

}

<强>输出

Should Pass
-----------
true
true
true

Should Fail
-----------
false
false
false
false