【问题标题】:Regex ignore tokens that do not start with letter正则表达式忽略不以字母开头的标记
【发布时间】:2020-09-27 13:23:16
【问题描述】:

如何编写一个忽略任何不以字母开头的标记的正则表达式?它应该在java中使用。

示例:it 's super cool --> 正则表达式应匹配:[it, super, cool] 并忽略 ['s]

【问题讨论】:

    标签: java regex string token


    【解决方案1】:

    替代正则表达式:

    "(?:^|\\s)([A-Za-z]+)"
    

    上下文中的正则表达式:

    public static void main(String[] args) {
        String input = "it 's super cool";
    
        Matcher matcher = Pattern.compile("(?:^|\\s)([A-Za-z]+)").matcher(input);
    
        while (matcher.find()) {
            String result = matcher.group(1);
            System.out.println(result);
        }
    }
    

    输出:

    it
    super
    cool
    

    注意:要匹配任何语言(例如印地语、德语、中文、英语等)的字母字符、字母,请改用以下正则表达式:

    "(?:^|\\s)(\\p{L}+)"
    

    更多关于类 Pattern 以及 Unicode 脚本、块、类别和二进制属性的类,可以找到 here

    【讨论】:

    • 此答案可能不完整,具体取决于“令牌”的含义。是什么将令牌与另一个令牌分开?只有仅由字母组成的标记才会被识别为一个。令牌“多普勒效应”只会产生“多普勒”并完全放弃“效应”。
    • [A-Za-z] 仅适用于英文字母。为了涵盖所有类型的字母(例如印地语、德语、中文等),您应该在 Java 中使用\\p{L}
    • 感谢您提供的信息!我不知道,因为我从未尝试过英文字母之外的正则表达式。我将添加该信息。谢谢阿文德!
    【解决方案2】:

    您可以使用(?<!\\p{Punct})(\\p{L}+),这表示字母前面没有标点符号。请注意,(?<! 用于指定 negative look behind。查看Pattern 的文档以了解更多信息。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
        public static void main(String[] args) {
            String str = "it 's super cool";
            Pattern pattern = Pattern.compile("(?<!\\p{Punct})(\\p{L}+)");
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                System.out.println(matcher.group());
            }
        }
    }
    

    输出:

    it
    super
    cool
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2012-07-29
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多