【问题标题】:Regular expression to identify separators between words用于识别单词之间分隔符的正则表达式
【发布时间】:2014-06-18 23:32:02
【问题描述】:

我正在尝试分隔文本中的单词。我需要用它们之间的任何东西来分割它们,所以我写了一个正则表达式,它几乎可以正常工作。

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

这是我目前想出的:

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

但是,这不适用于以破折号开头的单词,例如这种情况:

123-word

应该匹配

123-

对此的任何帮助将不胜感激,谢谢!

更新

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

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

... 这应该是这样的:

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

【问题讨论】:

  • 这很混乱,你是“识别分隔符”还是“分隔词”或匹配什么?你能提供示例输入和输出吗?
  • /[a-z](?:-?[a-z])*/ig 符合您的条件并因不允许a--b(两个或多个连续连字符)而获得奖励积分^_^
  • @MarkThomas,是的,我正在识别单词之间的分隔符。我用它现在的样子和应该如何更新了这个问题。谢谢!
  • 你能从上面的例子中显示你的预期输出吗?
  • @anubhava 是的,它是第一个下面的图像。或者您可以在这里查看:i.stack.imgur.com/3TaDJ.png

标签: regex


【解决方案1】:

如果我正确理解了您的问题。

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

看看这个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", "."]

用空替换

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"]

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式:

    /(?<=[^\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

    【讨论】:

    • 他想匹配分隔符,而不是单词。
    • 不完全清楚,如果您看到示例 OP 试图匹配 123-word 但试图避免 123-。在任何情况下,如果 OP 需要,使用相同的正则表达式方法很容易获得分隔符。
    • 不能将正则表达式缩短为 (?&lt;=\s|^)(?!-)([A-Za-z-]+)(?&lt;!-)(?=\s|$) 吗? — demo
    • 谢谢@AmalMurali,是的,肯定可以减少(见编辑)
    • 更新对他的示例文本不太好。 Demo.
    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    相关资源
    最近更新 更多