在两个字符串之间选择子字符串

3

我正在进行一些随机的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

每个字符串都不同。

我只是不太理解模式语法,这已经让我头疼了。谢谢你的时间 :)

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

谢谢大家!我最终使用了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;
    }
}

1
你不需要,也不应该使用正则表达式来处理这个问题。可以使用String.split()方法。例如,String.split(" ") 用空格作为参数将返回一个数组,其中每个元素都是一个单词。例如,String[] array = s.split(" ");,那么你就有了 array[0] = Word:array[1] = Word1 等等。如果你的格式不变,那么解析它就非常简单明了。 - Kon
4个回答

1

看起来你正在寻找冒号后面的单词或数字。您可以使用这个正则表达式:\\s(\\w+),它表示

  • :
  • \\s*零个或多个空格
  • (\\w+)一个或多个类型为0-9a-zA-Z_的字符。还通过用括号括起来将此匹配部分放置在group 1中

Demo:

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+),因为前者可以匹配零个或多个空格。 - Chandrayya G K

0

一句话:

String str = "Word: Word1 Description: Desc1 Type: 1";

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

0

这个正则表达式适用于上面的数据:

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

这个正则表达式的含义是什么:

  1. 开始一个捕获组 (
    1. 匹配单词边界 \b
    2. 匹配字母数字字符 \w 1次或多次 +
    3. 匹配单词边界 \b
  2. 关闭捕获组 )
  3. 断言从此位置开始不能匹配以下内容 (?! (负向先行断言)
    1. 字符 : 字面意义
  4. 关闭负向先行断言 )

-1
你可以使用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();

1
正如文档所述,StringTokenizer是一个遗留类,不应在新代码中使用。此外,当您使用像StringTokenizer这样的枚举器类型类时,您应该先调用hasNextWhatever()来确保它不会抛出异常,然后再调用nextWhatever() - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接