正则表达式匹配所有非单词字符,除非在数字之间

Regular Expression to match all non-word character unless between numbers

尝试开发 Java 8 种正则表达式来匹配几个不同字符串中的所有非单词字符,这样我就可以拆分它们。唯一的例外是当“:”位于数字之间时,例如“8:00AM”。

到目前为止,我想出了这个:"\W(?:(?<!\d)(?!\d))|[-/](?=\d)"
根据下面的字符串,我得到了以下结果:


M-F: 10AM - 6PM
M-D: 9am / 6pm F: 9am / 4pm
Seg-Qui: 08h às 17h Sex: 08h às 16h
L-V: 8:00AM - 6:00PM CST
M, F, 10AM-5PM
Lun-Jeu: 9/18h Ven:9/17h

但是,存在以下问题:

字符串Lun-Jeu: 9/18h Ven:9/17h中,不是select[=25=中的":" ]Ven:9。
在字符串Seg-Qui: 08h às 17h Sex: 08h às 16h中,如果可能的话我也想select整个单词“às”。

有人可以帮助修复正则表达式或提供更好的解决方案吗?

试试这个:

(?<!\d)[^\p{L}\d]|[^\p{L}\d](?!\d)

它选择任何不是 unicode 字母(即包括 à)或数字的东西,但前提是前面没有数字,或者后面没有数字。

您可以使用

(?U)\W(?<!\d:(?=\d))

在Java中:

String regex = "(?U)\W(?<!\d:(?=\d))";

参见regex demo

详情:

  • (?U) - Pattern.UNICODE_CHARACTER_CLASS 嵌入标志选项,使 \d\W 以及其他简写 Unicode-aware
  • \W - 任何单词 char
  • (?<!\d:(?=\d)) - 一个负向后视,它匹配一个没有紧跟数字和 : 并且紧跟数字的位置。

要使数字内的点的匹配也失败,请使用 (?U)\W(?<!\d[:.](?=\d))。如果您愿意,可以在那里添加更多字符。