JavaScript正则表达式:将字符串分割成单词

3
我有以下正则表达式:

console.log("Test #words 100-200-300".toLowerCase().match(/(?:\B#)?\w+/g))

从上面可以看到它正在分割“100-200-300”。我希望它忽略“-”并保持完整的单词,如下所示:

--> ["test", "#words", "100-200-300"]

我需要正则表达式在保持相同规则的情况下,加上不分割连接符“-”连接的单词。

1
你可以像 (?:\B#)?\w+(?:-\w+)* 或者没有 \B#?\w+(?:-\w+)* 一样重复匹配 -\w+。https://regex101.com/r/YRg5My/1 - The fourth bird
2
正则表达式是正确的解决方案吗?使用JavaScript在空格字符上进行“split”是否更好:str.split(" ")?对于下划线分隔的单词,您会怎么做? - dvo
我不确定正则表达式的完整作用,它是我们在索引脚本中使用的一行代码。由于它在“-”上进行拆分,导致出现故障,我不想改变它的功能,只想停止在“-”上进行拆分。 - MartinWebb
@Thefourthbird,你能展示一下整个正则表达式应该是什么样子吗?我不理解你的建议 - 谢谢。 - MartinWebb
@MartinWebb 你可以缩短代码并省略 .toLowerCase(),因为 \w 也匹配它。尝试 console.log("Test #words 100-200-300".match(/#?\w+(?:-\w+)*/g)); 参见 https://rextester.com/RSVR49477 - The fourth bird
显示剩余2条评论
1个回答

4
对于您当前的例子,您可以匹配一个可选的#,1个或更多个单词字符,并重复0次或多次匹配一个再次匹配#和1个或更多个单词字符的部分。
#?\w+(?:-\w+)*
  • #? 可选的 #
  • \w+ 1个或多个单词字符
  • (?:-\w+)* 作为一个组重复0次或多次匹配 - 和1个或多个单词字符

正则表达式演示

console.log("Test #words 100-200-300".toLowerCase().match(/#?\w+(?:-\w+)*/g));

关于\B 锚点(以下内容来自链接)

\B是\b的否定版本。在\b不匹配的每个位置,\B都会匹配。有效地说,\B匹配两个单词字符之间的任何位置,以及两个非单词字符之间的任何位置。

如果您确实想要使用该锚点,请查看例如一些匹配使用\B不使用\B的差异。


1
完美。谢谢。 - MartinWebb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接