我正在寻找标记字符串的最简单方法,例如
INPUT OUTPUT
"hello %my% world" -> "hello ", "%my%", " world"
在Java中。用正则表达式可以实现这个目的吗?我基本上是在寻找一个String.split(),它将“%*%”作为分隔符,但不会忽略它,因为它似乎通常会这样做。
由于
答案 0 :(得分:3)
不,你不能按照解释的方式做到这一点。原因是 - 它含糊不清!
您举例:
“你好%我的%世界” - > “你好”,“%my%”,“世界”
%应该在它之前还是之后附加到字符串?
输出应该是
“你好”,“%my”,“%world”
或者,输出可能是
“你好%”,“我的%”,“世界”
在您的示例中,您不遵循这些规则中的任何一个。你想出了%my%,它首先将分隔符附加到出现后的字符串,然后出现之前的字符串。
你看到了歧义吗?
因此,您首先需要提出一套关于您希望将分隔符附加到哪里的明确规则。一旦你这样做,一个简单的(虽然不是特别有效,因为字符串是不可变的)实现你想要的方式是:
String.split()
以正常方式分割字符串答案 1 :(得分:1)
更简单的解决方案是将字符串拆分为%
s。这样,每个其他子序列都在%
之间。之后您需要做的就是遍历结果,切换标志以了解结果是常规字符串还是%
之间的结果。
必须特别注意 split 实现,它如何处理空子序列。一些实现决定在输入的开始/结束时丢弃空子序列,其他实现丢弃所有空子序列,而其他实现则不丢弃它们。
这不会产生您想要的确切输出,因为%
将会消失。但是,如果确实需要它们,你可以轻松地添加它们(我认为没有)。
答案 2 :(得分:0)
为什么不用你的单词之间的空格分开。在这种情况下,你会得到“你好”,“%my%”,“世界”。
答案 3 :(得分:0)
如果可能,请使用更简单的分隔符。我可以将陪审团操纵“%”作为您的分隔符,这样您就可以获得String.split()
而不是正则表达式。但如果那不可能......
Regexps!您可以使用Matcher
解析此问题。如果你知道每行有一个分隔符,你可以指定一个吃掉整行的模式:
String singleDelimRegexp = "(.*)(%[^%]*%)(.*)";
Pattern singleDelimPattern = Pattern.compile(singleDelimRegexp);
Matcher singleDelimMatcher = singleDelimPattern.matcher(input);
if (singleDelimMatcher.matches()) {
String before = singleDelimMatcher.group(1);
String delim = singleDelimMatcher.group(2);
String after = singleDelimMatcher.group(3);
System.out.println(before + "//" + delim + "//" + after);
}
如果输入很长并且您需要一系列结果,则可以在循环中使用Matcher:
String multiDelimRegexp = "%[^%]*%";
Pattern multiDelimPattern = Pattern.compile(multiDelimRegexp);
Matcher multiDelimMatcher = multiDelimPattern.matcher(input);
int lastEnd = 0;
while (multiDelimMatcher.find()) {
String data = input.substring(lastEnd, multiDelimMatcher.start());
String delim = multiDelimMatcher.group();
lastEnd = multiDelimMatcher.end();
System.out.println(data);
System.out.println(delim);
}
String lastData = input.substring(lastEnd);
System.out.println(lastData);
随着时间的推移将这些添加到数据结构中,您将构建整个解析的输入。
在输入上运行:http://ideone.com/s8FzeW