从两个字符串之间提取复杂的字符串

时间:2012-02-21 15:02:19

标签: java regex

我有一个String,其中包含以下子字符串:

[Qual:3] [Text:PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1] [Elem:123]

我想在[Text:]之间提取部分,即PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1

我该怎么做?

4 个答案:

答案 0 :(得分:4)

Pattern p = Pattern.compile("\\[Text:(.*?)\\]");
Matcher m = p.matcher("[Qual:3] [Text:PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1] [Elem:123]");
m.find();
System.out.println(m.group(1));

给出:

PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1

\\[\\]将转义括号,这是正则表达式中的特殊字符。 .*?是一个非贪婪的量词,所以当它到达结束时,它会停止吞噬字符。正则表达式的这一部分在捕获组()内提供,您可以使用m.group(1)访问该组。

答案 1 :(得分:2)

使用以下字符串作为正则表达式:

"\\[Text:(.*?)\\]"

第一个捕获组将为您提供所需的子字符串。

非贪婪的匹配(.*?)需要在第一个]停止,而不是包括[Elem:123]

答案 2 :(得分:0)

String.substring(int beginIndex, int endIndex)

返回一个新字符串,该字符串是此字符串的子字符串。

您可以使用它来删除字符串的开头和结尾,

...或

您可以使用

String.indexOf(String str) 

获取匹配开始和结束的索引,并将内容复制到新的结果字符串。

您可以使用

String.matches(String regex) 

然而,编写正则表达式可能会变得困难,

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

我希望这会有所帮助。

答案 3 :(得分:0)

而不是像其他人所建议的那样使用"\\[Text:(.*?)\\]",我会更进一步,使用lookarounds过滤掉你不想要的文本:

(?<=\\[Text:).*?(?=\\])

这将与您想要的文本完全匹配,而无需选择捕获组。