我试图用Java编写一个正则表达式,以匹配单词和带连字符的单词。到目前为止,我有:

Pattern p1 = Pattern.compile("\\w+(?:-\\w+)",Pattern.CASE_INSENSITIVE);
Pattern p2 = Pattern.compile("[a-zA-Z0-9]+",Pattern.CASE_INSENSITIVE);
Pattern p3 = Pattern.compile("(?<=\\s)[\\w]+-$",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);


这是我的测试用例:

    程式
    Dsfasdf。程序程序Dsfasdf。 Dsfasdf。哇哇!哇。哇?好的。
    他说:“嗨。”阿斯法。 wsdfalsdjf。去去

asdfasdf ..,:; “'()?!-/ \ @#$%&^〜`* [] {} + _ 123

任何帮助都是极好的

我的预期结果是匹配所有单词,即。

程序Dsfasdf程序程序Dsfasdf Dsfasdf
哇哇哇哇哇好吧,他说嗨,阿斯法
wsdfalsdjf转到asdfasdf

我苦苦挣扎的部分是将在行之间拆分为一个单词的单词进行匹配。

即。

走-

最佳答案

\ p {L} +(?:-\ n?\ p {L} +)*
\ / ^ \ / ^ \ / \ / ^^^
 \ / | | | | \ / |||
  | | | | | | ||`-上一个可以重复0次或多次(文字'-'的组,可选的换行符和任意一个或多个字母(大写/小写))
  | | | | | | |`-结束第一个非捕获组
  | | | | | | `---匹配一个或多个前一个(任何字母,大写/小写)
  | | | | | `------匹配任意字母(大写/小写)
  | | | | `----------匹配单个换行符(由于`?`而可选)
  | | | `------------文字'-'
  | | `--------------开始第一个非捕获组
  | `----------------匹配前一个或多个(A-Z之间的任何字母(大写/小写))
  `-------------------匹配任意字母(大写/小写)


Is this OK?

09-25 21:06