用于标记单词和标点符号的正则表达式

regex for tokenizing words and punctuation

我一直在使用简单的 \b 拆分来标记英语字符串。但是,给定字符串 Hello, "Joe!"\b 上的拆分返回这些标记:

print join "\n", split /\b/, 'Hello, "Joe!"';
Hello
, "
Joe
!"

我需要单独的标点符号作为单独的标记。我需要的是下面的列表:

print join "\n", split /awesome regex here/, 'Hello, "Joe!"';
Hello
,
"
Joe
!
"

之后我可以处理空格,但我想不出一个快速的正则表达式方法来正确地分割字符串。有什么想法吗?

编辑

更好的测试用例是 "Hello there, Joe!",因为它检查单词是否正确拆分。

您可以使用 lookarounds 正则表达式来获取:

print join "\n", split /\s+|(?=\p{P})|(?<=\p{P})/, 'Hello, "Joe!"';

输出:

Hello
,
"
Joe
!
"

\p{P} 匹配任何标点符号。

示例 2:

print join "\n", split /\s+|(?=\p{P})|(?<=\p{P})/, 'hello there, Joe!';
hello
there
,
Joe
!

做匹配而不是拆分。

[A-Za-z]+|[^\w\s]
(?=\W)|(?<=\W)|\s+

您可以尝试 this.See 演示。

https://regex101.com/r/fX3oF6/4