正则表达式,引号之间的值

时间:2011-03-23 23:11:55

标签: java regex

我在使用java构建正则表达式时遇到了一些麻烦。

约束是,我需要分割一个由!分隔的字符串。这两个字符串将用双引号括起来。 例如:

"value"!"value"

如果我在上面的字符串上执行了java split(),我想得到:

value
value

然而,捕获的值可以是任何字符/标点/数字字符/空格/等。

所以这是一个更具体的例子。输入:

""he! "l0"!"wor!"d1"

Java的split()应该返回:

"he! "l0
wor!"d1

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:2)

将值拆分为“!”而不是!

String REGEX = "\"!\"";

String INPUT = "\"\"he! \"l0\"!\"wor!\"d1\"";

String[] items = p.split(INPUT);

答案 1 :(得分:2)

试试这个词:(".*")\s*!\s*(".*")

虽然它不适用于拆分,但它应该与PatternMatcher一起使用,并将2个字符串作为组返回。

String input = "\"  \"he\"\"\"\"! \"l0\" ! \"wor!\"d1\"";
Pattern p = Pattern.compile("(\".*\")\\s*!\\s*(\".*\")");
Matcher m = p.matcher(input);
if(m.matches())
{
  String s1 = m.group(1); //"  "he""""! "l0"
  String s2 = m.group(2); //"wor!"d1"
}

编辑:

这不适用于所有情况,例如: "he"!"llo" ! "w" ! "orld"会得到错误的群体。在那种情况下,真的很难确定哪个!应该是分隔符。这就是为什么通常很少使用的字符用于分隔字符串的各个部分,例如电子邮件地址中的@:)

答案 2 :(得分:1)

感觉您需要解析:

DOUBLEQUOTE = "
OTHER = anything that isn't a double quote
EXCLAMATION = !
ITEM = (DOUBLEQUOTE (OTHER | (DOUBLEQUOTE OTHER DOUBLEQUOTE))* DOUBLEQUOTE
LINE = ITEM (EXCLAMATION ITEM)*

感觉可以为上面创建一个正则表达式(假设ITEM中的双引号不能进一步嵌套)但是一个非常简单的语法可能会更好地服务。

这可能有用......可以删除遗漏等等

^"([^"]*|"[^"]*")*"(!"([^"]*|"[^"]*")*")*$

另一个选择是匹配第一部分,然后,如果有一个!等等,修剪掉!并保持匹配(原谅非特定语言,我只是想说明这个想法):

resultList = []
while(string matches \^"([^"]*|"[^"]*")*(.*)$" => match(1)) {
    resultList += match
    string = match(2)
    if(string.beginsWith("!")) {
        string = string[1:end]
    } elseif(string.length > 0) {
        // throw an error, since there was no exclamation and the string isn't done
    }
}
if(string.length > 0) {
    // throw an exception since the string isn't done
}
resultsList == the list of items in the string

编辑:我意识到我的答案并没有真正起作用。您可以在字符串中包含单个双引号以及感叹号。因此,你真的不能拥有“!”在其中一个字符串中。因此,1)拉出结尾的引号,2)拆分'“!”'的想法真的是正确的方法。