【发布时间】:2018-03-06 12:33:28
【问题描述】:
我正在尝试将基于 JavaScript 中的正则表达式:/[\w'-]+|[^\w\s]+/g 的字符串标记化为带有适当标点符号的相应单词。
我的 RegEx 在这些用例中失败:
let text = `Hello-world.`;
let text2 = `I'm Kunal`;
let text3 = `... that Manhattan vegetarian restaurant Dirt Candy is "waging war on the 'eat your vegetables' mind-set"?`;
console.log(JSON.stringify(text.match(/[\w'-]+|[^\w\s]+/g), undefined, 4));
console.log(JSON.stringify(text2.match(/[\w'-]+|[^\w\s]+/g), undefined, 4));
console.log(JSON.stringify(text3.match(/[\w'-]+|[^\w\s]+/g), undefined, 4));
我的正则表达式在这些情况下失败:
总而言之,我无法对某些字符进行标记,例如:-、'、?、. 和其他类似的字符,而我的正则表达式在上述用例中被打破。
编辑:
标点符号与英语共享,其中大部分是:
-
.-> 期间 -
,-> 逗号 -
!-> 感叹号 -
?-> 问号 -
:-> 冒号 -
;-> 分号 -
~-> 波浪号 -
--> 连字符 -
--> 破折号 -
&-> & 符号 -
...-> 省略号 -
""-> 双引号 -
''-> 单引号 -
[ and ]-> 括号 -
{ , }-> 大括号 -
( and )-> 括号 -
|-> 水平线 -
\ and /-> 正斜杠和反斜杠 -
*-> 星号 -
^-> 插入符号 -
$-> 美元符号 -
#-> 井号/井号 -
@-> 在符号处
所以拆分规则是:在词尾和上面提到的标点处拆分字符串。
我还想将转义序列过滤为单个标记。
这是我的解决方案的fiddle。
【问题讨论】:
-
您的意思是您需要将特殊字符匹配为单个标记吗?
/[\w'-]+|[^\w\s]/g? -
不,它只是没有在标点符号处拆分,例如:
hello-world.标记化的输出必须是:[hello,-,world,.] 全部拆分标点符号而不是替换它们。看看上面的表格。 -
@WiktorStribiżew 是的,我想将它们作为单个令牌进行匹配。
-
那你只需要
/\w+|[^\w\s]/g。 -
@WiktorStribiżew 你能解释一下你在回答中使用正则表达式的方法吗?
标签: javascript regex ecmascript-6