正则表达式匹配所有非单词字符,除非在数字之间
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))
。如果您愿意,可以在那里添加更多字符。
尝试开发 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))
。如果您愿意,可以在那里添加更多字符。