我之前已经问了一个类似的问题,但是我想知道是否有一个正则表达式来解析一个字符串,这样就可以提取数字和字符串,忽略所有标点符号,但是对于每个单词都允许单个撇号,无论它是否在从中间或结尾开始。
String problem = "'Cause I''m lo#o@kin' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs.";
String[] solve = {"'Cause", "I'm", "lookin'", "to", "extract", "all", "8", "substrings"};
基本上,除了单撇号之外,我想完全忽略标点符号来提取数字和单词。我知道如何获得单词和字符串,但我似乎无法弄清楚这个棘手的部分。
请注意I'm
只包含一个撇号,即使其间有两个撇号。
答案 0 :(得分:1)
单个replaceAll函数和split函数就足够了。
String problem = "'Cause I''m lo#o@kin' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs.";
System.out.println(Arrays.toString(problem.replaceAll("(?!')\\p{P}|\\p{S}|(')+","$1").split("\\s+")));
<强>输出:强>
['Cause, I'm, lookin', to, extract, all, 8, substrings]
或强>
String problem = "'Cause I''m lo#o@kin' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs.";
System.out.println(Arrays.toString(problem.replaceAll("[^\\w\\s']|(')+","$1").split("\\s+")));
答案 1 :(得分:0)
您可以尝试使用正则表达式删除所有符号和标点符号而不使用单个撇号:
[\p{S}\p{P}&&[^']]+
结果:'Cause I''m lookin' to extract all 8 substrings
然后,您必须用.replaceAll
替换双单撇号,然后以与上一个答案相同的方式拆分。
以下是代码:
String s = "I'm lo#o@king t%o ext!r$act a^ll 6 su*bs(tr]i{ngs.";
String parts[] = s.replaceAll("[\\p{S}\\p{P}&&[^']]+", "").replaceAll("[']{2}", "'").split("\\s+");
for (int i=0; i<parts.length; i++)
System.out.println(parts[i]);
结果:
I'm
looking
to
extract
all
6
substrings