在java中使用正则表达式拆分文本的问题

时间:2012-06-01 19:09:37

标签: java regex

对我对正则表达式世界的不了解表示歉意。我正在尝试使用正则表达式分割文本。这就是我现在正在做的事情。请考虑以下字符串


String input = "Name:\"John Adam\"  languge:\"english\"  Date:\" August 2011\"";
Pattern pattern = Pattern.compile(".*?\\:\\\".*?\\\"\\s*");
Matcher matcher = pattern.matcher(input);
List keyValues = new LinkedList();
while(matcher.find()){
   System.out.println(matcher.group());
   keyValues.add(matcher.group());
}
System.out.println(keyValues);

我得到正确的输出,这就是我正在寻找的。


Name:"John Adam"  
languge:"english"  
Date:" August 2011"

现在,我正在努力使它变得有点通用。对于例如如果我在输入字符串中添加另一个模式。我在一个不同的模式中添加了一个新值Audience :( user),即“被()替换为


String input = "Name:\"John Adam\"  languge:\"english\"  Date:\" August 2011\"  Audience:(user)";

这是什么通用模式?对不起,如果这听起来太蹩脚了。

由于

3 个答案:

答案 0 :(得分:2)

第1步:删除大部分的baskslashes - 你不需要转义引号或冒号(它们只是另一个普通字符)

尝试这种模式:

".*?:[^\\w ].*?[^\\w ]\\s*"

它适用于所有非字/空格字符作为分隔符,适用于您的测试用例,适用于name:'foo'

答案 1 :(得分:1)

您始终可以使用OR运算符|

Pattern pattern = Pattern.compile("(.*?\\:\\\".*?\\\"\\s*)|(.*?\\:\\(.*?\\)\\s*)");

答案 2 :(得分:1)

首先,我应该指出正则表达式不是一个神奇的子弹。我的意思是,虽然它们在某些情况下可以非常灵活和有用但它们并不能解决文本匹配的所有问题(例如解析类似XML的标记)

但是,在您给出的示例中,您可以使用|语法指定要匹配的备用模式。一个例子可能是:

Pattern pattern = Pattern.compile(".*?\\:(\\\".*?\\\"|\\(.*?\\))\\s*");

括号中的这一部分:(\\\".*?\\\"|\\(.*?\\))可以被认为是:找到一个匹配\\\".*?\\\"\\(.*?\\)的模式(并记住反斜杠的含义 - 它们是转义字符。

请注意,虽然这种方法虽然灵活,但要求您在字面上添加一个特定的案例,因此在绝对意义上它并不是真正的通用。

为了更好地说明我的意思是不能制作出真正通用的解决方案,这里有一个你可以使用的更通用的模式:

Pattern pattern = Pattern.compile(".*?\\:[\\\"(]{1,2}.*?[\\\")]{1,2}\\s*");

上面的模式使用了字符类,它更通用但虽然它会与您的示例相匹配,但它也会匹配以下内容:blah:\stuff\blah:"stuff"甚至是blah:\"stuff)之类的混合类或更差blah:((stuff""