正则表达式:忽略引号之间的文本

5
我有一个正则表达式,它是[\\.|\\;|\\?|\\!][\\s]。它用于拆分字符串。但是如果这些符号在引号内,我不想让它们被拆分。

2
我认为你需要开始考虑解析,而不是正则表达式分割。不过如果有一些示例输入的话,这会更容易回答。 - deceze
解析是一种选择,但我想知道如何使用正则表达式来完成。有没有办法做到这一点? - Athiwat Chunlakhan
正则表达式不是用于此类任务的工具,无论你想用它来做什么,因为它只是解析的替代品。我认为你需要放弃这个任务,学习上面提到的解析知识。 - Hovercraft Full Of Eels
我认为在这种情况下正则表达式可能会遇到的问题被称为“灾难性回溯”。 - Hovercraft Full Of Eels
我已经完成了单词和音节部分的解析器,但是对于句子部分,我想做一些不同的事情。我想我将不得不回到旧的东西。 - Athiwat Chunlakhan
2个回答

7

我建议使用 Pattern 和 Matcher 来代替 split。

以下是示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {

        String text = "start. \"in quotes!\"; foo? \"more \\\" words\"; bar";

        String simpleToken = "[^.;?!\\s\"]+";

        String quotedToken =
                "(?x)             # enable inline comments and ignore white spaces in the regex         \n" +
                "\"               # match a double quote                                                \n" +
                "(                # open group 1                                                        \n" +
                "  \\\\.          #   match a backslash followed by any char (other than line breaks)   \n" +
                "  |              #   OR                                                                \n" +
                "  [^\\\\\r\n\"]  #   any character other than a backslash, line breaks or double quote \n" +
                ")                # close group 1                                                       \n" +
                "*                # repeat group 1 zero or more times                                   \n" +
                "\"               # match a double quote                                                \n";

        String regex = quotedToken + "|" + simpleToken;

        Matcher m = Pattern.compile(regex).matcher(text);

        while(m.find()) {
            System.out.println("> " + m.group());
        }
    }
}

生成以下内容:

> start
> "in quotes!"
> foo
> "more \" words"
> bar

正如您所看到的,它还可以处理引号内部的转义引号。


1
以下是我忽略匹配引号的方法。
(?:[^\"\']|(?:\".*?\")|(?:\'.*?\'))*?    # <-- append the query you wanted to search for - don't use something greedy like .* in the rest of your regex.

适用于正则表达式的方法是将此内容更改为:

要适应您的正则表达式,您可以执行以下操作


(?:[^\"\']|(?:\".*?\")|(?:\'.*?\'))*?[.;?!]\s*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接