Java:如何利用高级字符串替换所有正则表达式w / w和out / lookahead / Lookbehind

时间:2018-12-09 00:53:56

标签: java regex regex-lookarounds

我试图只接受单词中间有连字符或不带连字符或单词中间或末尾带撇号的常规单词。因此,任何数字字符串或带有任何其他特殊字符的数字字符串都将替换为空格。同样,不需要考虑前面的空格,因为这些字符串将从文件中读取并且已经使用空格分隔。

即“ 0”,“-hi”,“ hi-”和“'hello”将全部被拒绝。

但是,将接受“苹果”,“本”,“本”和“受人尊敬”。

我正在尝试使用Java的String replaceAll功能来解决这个问题。我想知道如何使用“简单的”正则表达式来执行此操作,以及如何利用更高级的后向/后向实现此功能。

到目前为止,关于RegEx,这是我尝试过的事情:

String tempString;
tempString = tempString.replaceAll("^([a-zA-Z]+(-)?[a-zA-Z]+)"," ");
tempString = tempString.replaceAll("^([a-zA-Z]+(')?[a-zA-Z]*)"," ");
//Basically if it does not meet this condition, replace w/ whitespace

截至目前,正则表达式的语法甚至都不正确。针对上述关联的“不可接受”字词测试这两个字中的任意一个,都不会将它们替换为“”。最重要的是,我需要将这两个RegEx合并为一个,以实现适当的整体功能。

类似地,据我了解,我可以利用先行/后行来获得所需的结果。但是,在阅读了该过程之后,我对将插入到replaceAll函数中的语法感到困惑。

所以,我的两个问题如下:

  1. 在一次replaceAll函数调用中,可以更改RegEx的语法以检查连字符和撇号吗?
  2. 我如何利用先行/后行实现相同的目标?

请注意,我不是在寻找其他解决方案,因为我试图更好地了解RegEx。这也是我的第一个问题,对于任何格式问题或其他愚蠢的事情,我们深表歉意。

谢谢!

1 个答案:

答案 0 :(得分:0)

此正则表达式应该有效。但是我们必须将输入文件分成单词,然后再进行正则表达式。因为String.replaceAll搜索序列继续。例如'-apple',replaceAll将始终跳过'-',然后匹配'apple'。

legal chars + ( (-or') and legal chars )``+ ( (-or') and legal chars ) + ...

@Test
public void test() {
    Pattern pattern = Pattern.compile("([\\w]*[a-zA-Z][\\w]*)([-'][\\w]*[a-zA-Z][\\w]*)*");

    Matcher m = pattern.matcher("0");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("apple");
    Assert.assertTrue( m.matches());
    m = pattern.matcher("apple-");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("-apple");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("apple-a0");
    Assert.assertTrue( m.matches());
    m = pattern.matcher("Tom-Jerry's");
    Assert.assertTrue( m.matches());
}