Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更正现有正则表达式/创建新正则表达式_Java_Regex_String - Fatal编程技术网

Java 更正现有正则表达式/创建新正则表达式

Java 更正现有正则表达式/创建新正则表达式,java,regex,string,Java,Regex,String,我试图学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其输入到标记器中。字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格 比如说, six-pack=>six-pack 他是 这个,那个=>这个,那个 起初我试图用空格替换所有的标点符号,但那不起作用。 我试图通过指定单词边界来替换那些标点符号,如中所示 \B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B 但是,我不能从中排除

我试图学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其输入到标记器中。字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格

比如说,

six-pack=>six-pack
他是
这个,那个=>这个,那个
起初我试图用空格替换所有的标点符号,但那不起作用。 我试图通过指定单词边界来替换那些标点符号,如中所示

\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B
但是,我不能从中排除连字符和撇号

我猜上面的正则表达式也很麻烦,应该有更好的方法。有吗

所以,我想做的就是:

  • 用空格替换所有标点符号
  • 如果是连字符/撇号,请不要执行上述操作
  • 如果连字符/撇号出现在单词的开头/结尾,请务必替换

  • 非常感谢您的帮助。

    您可以使用此基于前瞻性的正则表达式:

    (?!(?!^)['-])\\p{Punct}
    

    您可能可以计算出一组单词之间的标点符号,而另一组单词之间的标点符号则不确定,然后在此基础上定义正则表达式

    例如:

    String[] input = {
        "six-pack",//  => six-pack
        "He's",// => He's
        "This,that"// => This That"
    };
    for (String s: input) {
        System.out.println(s.replaceAll("(?<=\\w)[\\p{Punct}&&[^'-]](?=\\w)", " "));
    }
    
    注意


    在这里,我使用一个字符类来定义
    模式
    ,该字符类包含标点符号的所有posix,前后跟一个单词字符,但对包含
    '
    -

    的字符类求反,您可以使用如下的负前瞻断言

    String s = "six-pack\n"
            + "He's\n"
            + "This,that";
    System.out.println(s.replaceAll("(?m)^['-]|['-]$|(?!['-])\\p{Punct}", " "));
    
    输出:

    6包
    他是
    这个那个
    
    说明:

    • (?m)
      多行模式
    • ^['-]
      匹配开头的
      '
      -
    • |
    • ['-]$
      匹配行末尾的
      '
      -
    • |
    • (?!['-])\\p{Punct}
      匹配除这两个
      -
      之外的所有标点。它不会接触匹配的
      [-']
      符号(即,在开始和结束处)

    您可能可以计算出一组单词之间的标点字符,而另一组单词之间的标点字符则不合格,然后在此基础上定义正则表达式。但是,这并不能解决字符串包含标点字符作为单独单词(如“this-that”)的情况是的,OP确实需要澄清这一点,但在这种情况下,您尝试在sentence@Flash:查看我的演示,看看您是否能在regex101.com上生成此正则表达式失败的案例