【问题标题】:split a string based on pattern in java - capital letters and numbers根据java中的模式拆分字符串 - 大写字母和数字
【发布时间】:2010-05-17 15:41:26
【问题描述】:

我有以下字符串“3/4Ton”。我想将其拆分为 -->

word[1] = 3/4 和 word[2] = 吨。

现在我的代码如下所示:-

Pattern p = Pattern.compile("[A-Z]{1}[a-z]+");
Matcher m = p.matcher(line);
while(m.find()){
    System.out.println("The word --> "+m.group());
    }

它执行根据大写字母拆分字符串所需的任务,例如:-

String = MachineryInput

word[1] = 机械,word[2] = 输入

唯一的问题是它不保留数字或缩写或大写字母序列,它们不应该是单独的单词。有人能帮我解决我的正则表达式编码问题吗?

提前谢谢...

【问题讨论】:

  • “单词”的开头是什么?它不能是任何大写字母或数字,因为“3/4”将是两个单词,“3/”和“4”。我认为你需要更准确地定义你的规则才能得到一个好的答案。
  • 数字或大写字母。我感到困惑的是如何将我的两个要求合并到一个正则表达式中?我需要知道使用正则表达式的最佳方法是什么,以便我的程序能够根据数字或大写字母作为起点来划分字符串。谢谢

标签: java regex string


【解决方案1】:

您实际上可以在正则表达式中单独使用向前看和向后看 (请参阅此页面上的特殊构造:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

/**
 * We'll use this pattern as divider to split the string into an array.
 * Usage: myString.split(DIVIDER_PATTERN);
 */
private static final String DIVIDER_PATTERN =

        "(?<=[^\\p{Lu}])(?=\\p{Lu})"
                // either there is anything that is not an uppercase character
                // followed by an uppercase character

                + "|(?<=[\\p{Ll}])(?=\\d)"
        // or there is a lowercase character followed by a digit

        ;

@Test
public void testStringSplitting() {
    assertEquals(2, "3/4Word".split(DIVIDER_PATTERN).length);
    assertEquals(7, "ManyManyWordsInThisBigThing".split(DIVIDER_PATTERN).length);
    assertEquals(7, "This123/4Mixed567ThingIsDifficult"
                        .split(DIVIDER_PATTERN).length);
}

所以你可以这样做:

for(String word: myString.split(DIVIDER_PATTERN)){
    System.out.println(word);
}

肖恩

【讨论】:

  • 我在“|(?
  • 你是对的,有一个 + 缺失(当我添加文档时丢失了)。我马上添加。
  • 顺便说一句,如果您对将来能够支持重音大写字符或其他语言感兴趣,您应该考虑使用 \p{Lu} 而不是 \p{Upper}
【解决方案2】:

在这里使用正则表达式会很好。我打赌也有办法做到这一点,虽然我不是一个在藤蔓上摇摆不定的正则表达式人,所以我帮不了你。然而,有些事情是你无法避免的——有些事情最终需要在你的字符串上循环。您可以像这样“自己”执行此操作:

String[] splitOnCapitals(String str) {
    ArrayList<String> array = new ArrayList<String>();
    StringBuilder builder = new StringBuilder();
    int min = 0;
    int max = 0;
    for(int i = 0; i < str.length(); i++) {
        if(Character.isUpperCase(str.charAt(i))) {
            String line = builder.toString().trim();
            if (line.length() > 0) array.add(line);
            builder = new StringBuilder();
        }
        builder.append(str.charAt(i));
    }
    array.add(builder.toString().trim()); // get the last little bit too
    return array.toArray(new String[0]);
}

我使用以下测试驱动程序对其进行了测试:

public static void main(String[] args) {
    String test = "3/4 Ton truCk";
    String[] arr = splitOnCapitals(test);
    for(String s : arr) System.out.println(s);

    test = "Start with Capital";
    arr = splitOnCapitals(test);
    for(String s : arr) System.out.println(s);
}

得到以下输出:

3/4
Ton tru
Ck
Start with
Capital

【讨论】:

  • 感谢您的帮助。它绝对给了我方向感,并为我展示了一种不同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2016-08-09
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多