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

时间:2015-07-16 09:02:10

标签: regex perl tokenize

我一直用简单的\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!",因为它会检查单词是否正确分割。

3 个答案:

答案 0 :(得分:1)

您可以使用lookarounds regex来获取此信息:

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
!

答案 1 :(得分:1)

匹配而不是拆分。

[A-Za-z]+|[^\w\s]

答案 2 :(得分:1)

(?=\W)|(?<=\W)|\s+

你可以尝试一下。参见演示。

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