【问题标题】:What is the correct regex to match uppercase letter for only first letter in words什么是正确的正则表达式来匹配单词中的第一个字母的大写字母
【发布时间】:2014-08-20 08:32:36
【问题描述】:

现在我的程序使用这个模式.*[A-Z].* 来匹配每个有大写字母的单词。但我的问题是,我需要一种模式,它只能在单词的开头识别一个大写的单词。

现在我的程序的示例输入:-

我叫 Johan,来自 langKawi。

输出匹配: 我的 Johan I langKawi。

但是使用我的模式,像 langKawi 这样的单词,其中大写不在它仍然匹配的单词的开头。

任何人都可以帮助我匹配仅第一个字母为大写的单词并且我的文本/输入仅包含没有数字和符号的字母字符的模式。谢谢。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    这就是他们发明\b的原因:

    \b[A-Z][A-Za-z]*\b
    

    \b 充当单词边界:它匹配空格(和其他分隔符)或字符串的开头和结尾。

    捕获所有部分的示例:

    import java.util.regex.*;
    
    public class HelloWorld{
    
         public static void main(String []args){
            Pattern p = Pattern.compile("\\b([A-Z][a-z]*)\\b");
            Matcher m = p.matcher("My name is Johan and I am from langKawi.");
            while(m.find()) {
                System.out.println(m.group(1));
            }
         }
    }
    

    您可以测试代码here

    【讨论】:

    • 非常感谢@CommuSoft。我应该更多地学习如何使用 \b 并了解它的功能。
    【解决方案2】:

    在单词开始之前使用单词边界匹配,然后是单词,然后是另一个单词边界:

    \b[A-Z]\w*\b
    

    在 Java 中是这样的:

    Pattern p = Pattern.compile("\\b([A-Z]\\w*)\\b");
    
    String s = "My name is Johan and I am from langKawi.";
    Matcher matcher = p.matcher(s);
    
    while(matcher.find()){
        System.out.println(matcher.group(1));
    }
    

    这个输出:

    My
    Johan
    I
    

    【讨论】:

    • @zx81:否则正则表达式将包含(潜在的)单词边界,如空格。为了防止这种情况,您只对重要部分进行分组。
    • @CommuSoft 不是这样:\b 是一个零宽度断言。它不消耗。 :)
    • @zx81:出于好奇:如果你想捕获边界怎么办(假设你对单词末尾的分隔符感兴趣)。
    • 捕获边界是一种常见且有用的技术。例如,它用于在“不可见的地方”进行分割,如myBeautifulCamel 中的骆驼空间分隔符之间的分割。我说的是最广义的边界,包括\b 和 DIY 边界,例如环视。
    • 我已经用我的数据测试了该模式并且它有效。非常感谢尼克。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多