正则表达式,用于标识单词之间的分隔符

时间:2014-06-18 13:46:16

标签: regex

我正在尝试将文字中的单词分开。我需要在它们之间用任何东西拆分它们,所以我写了一个正则表达式,它可以正常工作

单词是可以包含短划线( - )的字母字符串,它们不能以短划线开头或以短划线结束。除了单个破折号和[a-zA-Z]之外,单词不能包含数字或任何其他字符。

这是我到目前为止所提出的:

/(-[^a-zA-Z])|\w*\d\w*|[^a-zA-Z-]+/ig

然而,对于以破折号开头的单词,这种情况无法正常工作,例如:

123-word

那应该匹配

123-

非常感谢任何有关这方面的帮助,谢谢!

更新

对不起,我很模糊。我需要匹配单词之间的内容,而不是单词本身,所以我可以进一步分成数组。

到目前为止,这与上面的表达式匹配: enter image description here

......这应该是这样的: enter image description here

注意第二个文本行(123-)的匹配差异 很抱歉没有足够具体。

2 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:

/(?<=[^\w-]|^)(?!-)([a-z-]+)(?<!-)(?=[^\w-]|$)/gi

给出如下输入:

abc-def word A -notword xyz notword-

上述正则表达式将匹配以下单词:

abc-def
word
A
xyz

Working demo


更新:根据已修改的问题,您可以使用此正则表达式进行拆分:

/([^\w-].*?)(?=(?<=[^\w-]|^)(?!-)[a-z-]+(?<!-)(?=[^\w-]|$))/gis

Working demo

答案 1 :(得分:0)

如果我理解你的问题。

我没有搜索有效的匹配项,而是替换了所有无效的匹配项。

看看这个Demo 它根据您的问题匹配所有无效匹配,我已理解。

“单词是可以包含短划线( - )的字母字符串,它们不能以破折号开头或以破折号结尾。除了单个破折号和[a-zA-Z]之外,单词不能包含数字或任何其他字符。”

这是代码

var str = 'word word-ed, [word-ing] 123-word w-word, word-. w0rd w14rd 124eword 1234word finished.'
str.replace(/(\b[\d]+-[a-zA-Z]+\b)|(\b[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+-[.,]|([\[\],.]))/g, '').split(/\s+/)

<强>输出

["word", "word-ed", "word-ing", "w-word", "finished"]

<强>解释

搜索无效匹配

str.match(/(\b[\d]+-[a-zA-Z]+\b)|(\b[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+-[.,]|([\[\],.]))/g)
//output
[",", "[", "]", "123-word", ",", "word-.", "w0rd", "w14rd", "124eword", "1234word", "."]

替换为null

var temp = str.replace(/(\b[\d]+-[a-zA-Z]+\b)|(\b[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+[\d]+[a-zA-Z]+)|(\b[a-zA-Z]+-[.,]|([\[\],.]))/g)
//output
"word word-ed word-ing  w-word      finished"

用空格分割结果

temp.split(/\s+/)
//output
["word", "word-ed", "word-ing", "w-word", "finished"]