我试图用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?