我在使用java构建正则表达式时遇到了一些麻烦。
约束是,我需要分割一个由!分隔的字符串。这两个字符串将用双引号括起来。 例如:
"value"!"value"
如果我在上面的字符串上执行了java split(),我想得到:
value
value
然而,捕获的值可以是任何字符/标点/数字字符/空格/等。
所以这是一个更具体的例子。输入:
""he! "l0"!"wor!"d1"
Java的split()应该返回:
"he! "l0
wor!"d1
非常感谢任何帮助。谢谢!
答案 0 :(得分:2)
将值拆分为“!”而不是!
String REGEX = "\"!\"";
String INPUT = "\"\"he! \"l0\"!\"wor!\"d1\"";
String[] items = p.split(INPUT);
答案 1 :(得分:2)
试试这个词:(".*")\s*!\s*(".*")
虽然它不适用于拆分,但它应该与Pattern
和Matcher
一起使用,并将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)拆分'“!”'的想法真的是正确的方法。