3

如何格式化我的正则表达式以允许这样做?

这是正则表达式: "\\b[(\\w'\\-)&&[^0-9]]{4,}\\b"

它正在寻找任何 4 个字母或更大的单词。

如果我想拆分一篇文章,我想要一个包含所有分隔值以及它们之间的所有值的数组,所有这些值都按照它们最初出现的顺序。因此,例如,如果我想拆分以下句子:“我需要购买一辆新车。我更喜欢宝马。”,我想要的拆分结果如下,其中斜体值是分隔符。

“我”、“需要”、“要”、“购买”、“新”、“车辆”、“。我”、“会”、“”、“喜欢”、“宝马”。

因此,所有大于 4 个字符的单词都是一个标记,而每个分隔值之间的所有内容也是一个标记(即使它是带有空格的多个单词)。我只会修改分隔值,并希望保持其他所有内容相同,包括空格、换行符等。

我在另一个线程中读到,我可以使用环视来让它工作,但我似乎无法正确格式化它。甚至有可能让它以我想要的方式工作吗?

4

2 回答 2

3

我不确定您要做什么,但以防万一您想修改至少有四个字母的单词,您可以使用类似这样的东西(它会将带有 => 4 个字母的单词更改为其大写版本)

String data = "I need to purchase a new vehicle. I would prefer a BMW.";
Pattern patter =  Pattern.compile("(?<![a-z\\-_'])[a-z\\-_']{4,}(?![a-z\\-_'])",
        Pattern.CASE_INSENSITIVE);
Matcher matcher = patter.matcher(data);

StringBuffer sb = new StringBuffer();// holder of new version of our
                                        // data
while (matcher.find()) {// lets find all words
    // and change them with its upper case version
    matcher.appendReplacement(sb, matcher.group().toUpperCase());
}
matcher.appendTail(sb);// lets not forget about part after last match

System.out.println(sb);

输出:

I NEED to PURCHASE a new VEHICLE. I WOULD PREFER a BMW.

或者,如果您将替换代码更改为类似

matcher.appendReplacement(sb, "["+matcher.group()+"]");

你会得到

I [need] to [purchase] a new [vehicle]. I [would] [prefer] a BMW.

现在你可以在每个[]得到你想要的数组上拆分这样的字符串。

于 2013-11-13T02:11:22.260 回答
1

假设“单词”被定义为[A-Za-z],您可以使用这个正则表达式:

(?<=(\\b[A-Za-z]{4,50}\\b))|(?=(\\b[A-Za-z]{4,50}\\b))

完整代码:

class RegexSplit{
    public static void main(String[] args){
        String str = "I need to purchase a new vehicle. I would prefer a BMW.";
        String[] tokens = str.split("(?<=(\\b[A-Za-z]{4,50}\\b))|(?=(\\b[A-Za-z]{4,50}\\b))");
        for(String token: tokens){
            System.out.print("["+token+"]");
        }
        System.out.println();
    }
}

得到这个输出:

[我][需要][到][购买][一辆新的][车辆][。我][会][][更喜欢][宝马。]
于 2013-11-13T02:29:18.120 回答