【发布时间】:2019-12-30 20:03:47
【问题描述】:
此方法应返回所有出现的单引号字符串。但是,转义单引号 (\’) 应被视为常规单引号字符(就像 Java 中的转义双引号一样)。示例:“This ’isn\’t’ easy’”该方法应返回单个字符串 “isn’t”。
我的代码:
public static List<String> findSingleQuotedTextWithEscapes(String input) {
Pattern pattern = Pattern.compile ("(?:\\w|'[^']*')+");
Matcher matcher = pattern.matcher (input);
ArrayList ans = new ArrayList();
while (matcher.find ()){
ans.add (matcher.group ().replace ("'",""));
}
return ans;
}
输入:"more'test'" 预期:[test] 实际:[more,test]
我似乎在捕捉 ' 字符时遇到了问题,我正在标记所有内容,请帮忙。
添加测试人员:
void fillSingleQuotedTestInputs(List<String> inputs, List<List<String>> expect) {
inputs.add("'test'"); expect.add(Arrays.asList("test"));
inputs.add("more'test'"); expect.add(Arrays.asList("test"));
inputs.add("'test'more"); expect.add(Arrays.asList("test"));
inputs.add("\\'no'yes'"); expect.add(Arrays.asList("yes"));
inputs.add("a 'one' and 'two' and 'three'..."); expect.add(Arrays.asList("one", "two", "three"));
inputs.add("nothing at all"); expect.add(Arrays.<String>asList());
inputs.add("''"); expect.add(Arrays.asList(""));
inputs.add("''test"); expect.add(Arrays.asList(""));
inputs.add("test''"); expect.add(Arrays.asList(""));
inputs.add("te''st"); expect.add(Arrays.asList(""));
inputs.add("'This is not wrong' and 'this isn\\'t either'"); expect.add(Arrays.asList("This is not wrong", "this isn't either"));
inputs.add("'tw\\'o repl\\'acements' in 't\\'wo stri\\'ngs'."); expect.add(Arrays.asList("tw'o repl'acements", "t'wo stri'ngs"));
inputs.add("'\\''"); expect.add(Arrays.asList("'"));
inputs.add("'''"); expect.add(Arrays.asList(""));
inputs.add("'test1'\n'test2'"); expect.add(Arrays.asList("test1", "test2"));
inputs.add("''''"); expect.add(Arrays.asList("", "")); // This one is hard. Hint: \G
}
@Test
public void testFindSingleQuotedTextWithEscapes() {
ArrayList<String> inputs = new ArrayList<String>();
ArrayList<List<String>> expect = new ArrayList<List<String>>();
fillSingleQuotedTestInputs(inputs, expect);
for (int i = 0; i < inputs.size(); ++i) {
List<String> output = RegexpPractice.findSingleQuotedTextWithEscapes(inputs.get(i));
assertEquals(String.format("Test %d failed: Search <<%s>>", i, inputs.get(i)), expect.get(i), output);
}
}
【问题讨论】:
-
\w+\\’\w+有什么问题吗? -
不会捕捉到任何单词中间有 ' 的东西
-
我明白了,所以你需要一些环顾四周。
(?<=’)\w+(?:\\’\w+)*(?=’)regex101.com/r/dNQoCF/1 -
如果没有环视,我将如何做到这一点?
-
为什么? Java 支持环视,所以使用环视。
标签: java regex single-quotes