我正在寻找标记字符串的最简单方法,例如
INPUT OUTPUT
"hello %my% world" -> "hello ", "%my%", " world"
在爪哇。是否可以使用正则表达式来实现这一点?我基本上是在寻找一个 String.split() ,它将“%*%”形式的东西作为分隔符,但它不会像通常那样忽略它。
谢谢
不,您不能按照您解释的方式执行此操作。原因是——模棱两可!
你举个例子:
“你好 %my% 世界”->“你好”、“%my%”、“世界”
应该将 % 附加到字符串之前还是之后?
输出应该是
“你好”、“%my”、“%world”
或者,也许输出应该是
“你好%”、“我的%”、“世界”
在您的示例中,您不遵循这些规则中的任何一个。您想出了 %my% ,它将分隔符在出现后首先附加到字符串上,然后在出现之前附加到字符串上。
你看到歧义了吗?
因此,您首先需要提出一套明确的规则,说明您希望将分界符附加到何处。一旦你这样做了,一种简单的(虽然不是特别有效,因为字符串是不可变的)实现你想要的方法是:
String.split()
以正常方式拆分字符串一个更简单的解决方案是将字符串拆分为%
s。这样,每个其他子序列都在%
s 之间。之后您所要做的就是遍历结果,切换一个标志以了解结果是常规字符串还是%
s 之间的字符串。
必须特别注意拆分实现,它如何处理空子序列。一些实现决定在输入的开始/结束时丢弃空子序列,其他实现丢弃所有空子序列,而其他实现不丢弃它们。
这不会产生您想要的确切输出,因为%
s 会消失。但是,如果确实需要它们,您可以轻松地将它们添加回来(我认为没有)。
为什么不按单词之间的空格分开。在这种情况下,您将得到“hello”、“%my%”、“world”。
如果可能,请使用更简单的分隔符。而且我可以将陪审团操纵“%”作为您的分隔符,这样您就可以得到String.split()
而不是正则表达式。但如果这不可能...
正则表达式!您可以使用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