我需要在字符串中的所有标点符号之间添加空格。
[^a-ZA-Z\\d]+
我认为正则表达式是可行的,匹配所有非标点符号"Hello"
,在之前和/或之后添加空格,然后提取与所有标点private String addSpacesBeforePunctuation(String s) {
StringBuilder builder = new StringBuilder();
final String nonpunctuation = "[a-zA-Z\\d]+";
final String punctuation = "[^a-zA-Z\\d]+";
String found;
while (!s.isEmpty()) {
// regex stuff goes here
found = ???; // found group from respective regex goes here
builder.append(found);
builder.append(" ");
s = s.replaceFirst(found, "");
}
return builder.toString().trim();
}
匹配的余数。
但我不知道如何(递归?)调用这个正则表达式。查看第一个示例,正则表达式只匹配arr
。我想通过不断删除和附加匹配的正则表达式的第一个实例来构建一个新字符串,而原始字符串不为空。
value_vals = arr.map {|h| h[:value]}.reverse
#=> [5, 4, 3, 2, 1]
arr.map { |h| {value: value_vals.shift, contents: h[:contents]}}
#=> [{:value=>5, :contents=>"one"},
# {:value=>4, :contents=>"two"},
# {:value=>3, :contents=>"three"},
# {:value=>2, :contents=>"four"},
# {:value=>1, :contents=>"five"}]
然而,这并不是一种正确的方法...我认为我过于复杂化......
答案 0 :(得分:5)
您可以在Java中使用标点符号属性\p{Punct}
来使用基于外观的正则表达式:
str = str.replaceAll("(?<=\\S)(?:(?<=\\p{Punct})|(?=\\p{Punct}))(?=\\S)", " ");
(?<=\\S)
如果prev char不是空格(?<=\\p{Punct})
如果前一个字符是标点字符(?=\\p{Punct})
如果下一个char是标点字符(?=\\S)
如果下一个字符不是空格答案 1 :(得分:2)
当您看到标点符号时,您有四种可能性:
以下是正确替换的代码:
String ss = s
.replaceAll("(?<=\\S)\\p{Punct}", " $0")
.replaceAll("\\p{Punct}(?=\\S)", "$0 ");
它使用两个表达式 - 一个匹配数字2,一个匹配数字3.由于表达式相互应用,它们也会处理数字4。数字1不需要改变。