【问题标题】:Substring selection between two Strings两个字符串之间的子字符串选择
【发布时间】:2013-12-31 16:35:34
【问题描述】:

我正在做一些随机的 Java 工作,而我的应用程序会保存一个文件,其中包含如下数据:

Word: Word1 Description: Desc1 Type: 1 
Word: Word2 Description: Desc2 Type: 2 
Word: Word3 Description: Desc3 Type: 3 
Word: Word4 Description: Desc4 Type: 4 

它成功保存它,当我尝试检索数据时,我无法找出我应该应用什么正则表达式过滤器。例如,从行:

    Word: Word1 Description: Desc1 Type: 1 

我要提取:

Word1
Desc1
1

每一个都在不同的字符串中。

我只是没有完全理解 Patterns 语法,这已经让我头疼了。谢谢你的时间:)

----------------- 编辑-----

谢谢大家!我终于使用了Kon的答案。结果代码比我想象的要简单得多。我将代码留给可能有类似问题的任何人。

package resources;

import resources.manager.Word;

public class CommonFunctions {
public static Word parseString(String str){

    String[] stringA = str.split(" "); 

    Word result = new Word(stringA[1],stringA[3],Integer.parseInt(stringA[5]));
    return result;
}

public static String parseWord(Word wrd){
    //TODO
    return null;
    }
}

【问题讨论】:

  • 您不需要也可能不应该为此使用正则表达式。使用 String.split() 方法。例如,带有空格的String.split(" ") 将返回一个数组,其中每个元素中有一个单词。比如String[] array = s.split(" ");,那么你就有array[0] = Word:、array[1] = Word1等。如果你的格式没有变化,那么解析就非常简单了。

标签: java regex syntax substring


【解决方案1】:

此正则表达式适用于上述数据:

(\b\w+\b)(?!:)

这个正则表达式是什么意思:

  1. 开始一个捕获组(
    1. 匹配单词边界\b
    2. 匹配字母数字字符 \w 1 到无限次 +
    3. 匹配单词边界\b
  2. 关闭捕获组)
  3. 断言不能从该位置开始匹配以下内容(?!(负前瞻)
    1. 字符:字面意思
  4. 关闭负前瞻)

【讨论】:

    【解决方案2】:

    你可以使用 StringTokenizer:

    String str = "Word: Word1 Description: Desc1 Type: 1";
    StringTokenizer st = new StringTokenizer(str," ");
    
    st.nextToken();
    String word = st.nextToken();
    St.nextToken();
    String description = st.nextToken();
    st.nextToken();
    String type = st.nextToken();
    

    【讨论】:

    • 正如docs 中所说,StringTokenizer 是一个遗留类,不应在新代码中使用。此外,当你使用像 StringTokenizer 这样的枚举器类型的类时,你不应该在没有先调用 hasNextWhatever() 的情况下调用 nextWhatever() 以确保它不会引发异常。
    【解决方案3】:

    您似乎正在寻找放在: 之后的单词或数字。你可以使用这个正则表达式:\\s(\\w+),这意味着代表

    • :
    • \\s* 零个或多个空格
    • (\\w+) 一个或多个0-9、a-z、A-Z 或_ 类型的字符。同样通过用括号将其包围,正则表达式会将这部分匹配放在group 1

    演示:

    String[] data = { "Word: Word1 Description: Desc1 Type: 1 ",
            "Word: Word2 Description: Desc2 Type: 2 ",
            "Word: Word3 Description: Desc3 Type: 3 ",
            "Word: Word4 Description: Desc4 Type: 4 " };
    Pattern p = Pattern.compile(":\\s*(\\w+)");
    for (String s:data){
        Matcher m = p.matcher(s);
        while (m.find())
            System.out.println(m.group(1));
    }
    

    输出:

    Word1
    Desc1
    1
    Word2
    Desc2
    2
    Word3
    Desc3
    3
    Word4
    Desc4
    4
    

    【讨论】:

    • 好答案。但是建议使用 :\\s*(\\w+) 而不是 :\\s(\\w+) 匹配 : 之后的零个空格
    【解决方案4】:

    一个班轮:

    String str = "Word: Word1 Description: Desc1 Type: 1";
    
    // Output: ["Word1", "Desc1", "1"]
    str.replaceFirst(" ?\\w*: ", "").split(" ?\\w*: ");
    

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 2014-12-07
      • 2012-03-10
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      相关资源
      最近更新 更多