如何使用正则表达式来匹配特定类型单词之前的所有内容

2022-09-02 05:25:15

我是正则表达式的新手。

是否有可能在满足特定条件的单词之前匹配所有内容:

例如:

这是一个测试 - - +++这是一个测试

我希望它遇到一个以大写字母开头的单词,下一个字符是小写的。这是一个恰当的词。然后,我想删除该词之前的所有内容。

上面的例子应该产生:这是一个测试

我只想进行这种处理,直到它找到正确的单词,然后停止。

任何帮助将不胜感激。

谢谢


答案 1

取代

^.*?(?=[A-Z][a-z])

使用空字符串。这适用于 ASCII 输入。对于非 ASCII 输入(Unicode,其他语言),适用不同的策略。

解释

.*?    Everything, until
(?=    followed by
[A-Z]  one of A .. Z and
[a-z]  one of a .. z
)

支持 Java Unicode 的变体是这样的:

^.*?(?=\p{Lu}\p{Ll})

答案 2

醒来一点后,您不需要删除任何内容,甚至不需要创建一个子组 - 只需找到答案中其他地方表达的模式即可。下面是一个完整的示例:

import java.util.regex.*;

public class Test
{
    public static void main(String args[])
    {
        Pattern pattern = Pattern.compile("[A-Z][a-z].*");

        String original = "THIS IS A TEST - - +++ This is a test";
        Matcher match = pattern.matcher(original);
        if (match.find())
        {
            System.out.println(match.group());
        }
        else
        {
            System.out.println("No match");
        }        
    }
}

编辑:原始答案

这看起来像是在做正确的事情:

import java.util.regex.*;

public class Test
{
    public static void main(String args[])
    {
        Pattern pattern = Pattern.compile("^.*?([A-Z][a-z].*)$");

        String original = "THIS IS A TEST - - +++ This is a test";
        String replaced = pattern.matcher(original).replaceAll("$1");

        System.out.println(replaced);
    }
}

基本上,诀窍不是忽略正确单词之前的所有内容 - 而是将所有内容从正确的单词开始分组,并用该组替换整个文本。

上述内容会失败,因为“我”不被认为是一个合适的词。如果要解决此问题,请将 [a-z] 更改为 [a-z\s],这将允许使用空格而不是字母。"*** FOO *** I am fond of peanuts"