【问题标题】:simple regex to matching multiple word with spaces/multiple space or no spaces简单的正则表达式来匹配多个带有空格/多个空格或没有空格的单词
【发布时间】:2012-11-28 21:26:49
【问题描述】:

我正在尝试用单个或多个空格匹配所有单词。我的表情

(\w+\s*)* 不工作

编辑 1: 假设我有一个这种形式的句子

[[do "hi i am bob"]]
[[do "hi   i am Bob"]]

now I have to replace this with 
cool("hi i am bob") or 
cool("hi    i am Bob")

我不关心用单个替换多个空格。

我可以用像

这样的一个词来实现这一点

\[\[do\"(\w+)\"\]\] and replacing regex cool\(\"$1\") 但这看起来不是一个有效的解决方案,并且不匹配多个单词.... 对于不完整的问题,我深表歉意

我们将不胜感激任何帮助

【问题讨论】:

  • 你真正想要完成什么?您是否要隔离每个单词?查找不包括标点符号的字符序列?这里的实际目标到底是什么?
  • whatchu 试图摆脱那个正则表达式?>
  • @jfriend00 & thatidiotguy 对于不完整的问题,我深表歉意。请检查我是否已更新问题
  • 多么快速的编辑 - 现在一些“旧”答案看起来像愚蠢的。
  • -1 同意@Ωmega,随着更新,这个线程对后代几乎没有用......

标签: javascript java regex string


【解决方案1】:

找到这个正则表达式:

/\[\[do\s+("[\w\s]+")\s*\]\]/

并进行以下替换:

'cool($1)'

这里要做的唯一特别的事情是使用字符类来发挥我们的优势

[\w\s]+

匹配一个或多个单词或空格字符(a-z、A-Z、0-9、_ 和空格)。那';;吃掉你内部的东西没问题。

'[[do "hi   i am Bob"]]'.replace(/\[\[do\s+("[\w\s]+")\s*\]\]/, 'cool($1)')

吐出来

cool("hi   i am Bob")

虽然 - 如果你想添加标点符号(你可能会这样做),你应该这样做:

/\[\[do\s+("[^"]+")\s*\]\]/

这将匹配任何不是双引号的字符,保留您的子字符串。还有更复杂的可以让你处理转义引号,但我认为这超出了这个问题的范围。

【讨论】:

  • @Christophe 是的,我没有看到你回答的第二部分。尽管从技术上讲,您的答案与 OP 可能不想要的很多东西相匹配。换行符和额外的双引号。试试这个:'[[do "hi i am bob"]]\n[[do "hi i am Bob"]]'.replace(/\[\[do "([\s\S]+)"\]\]/, 'cool("$1")') - 它会产生一些意想不到的结果。
  • 哦,现在我看到了,我的也匹配换行符。虽然它不会匹配引号,但这可能没问题。
  • @FrankieTheKneeMan 直到你遇到一个叫 John-Paul 或 O'Brian 的人 ;-)
【解决方案2】:

要匹配“所有带有单个或多个空格的单词”,您不能使用\s*,因为它甚至会匹配没有空格。

另一方面,您甚至想匹配“hi”,这是一个没有空格的单词。

您可能想要匹配一个或多个以空格分隔的单词。如果是这样,请使用正则表达式模式

(\w+(?:$|\s+))+

\w+(\s+\w+)*

【讨论】:

    【解决方案3】:

    我不确定,但也许这就是你想要得到的:

    "Hi I am bob".match(/\b\w+\b/g);  // ["Hi", "I", "am", "bob"]
    

    【讨论】:

    • @AlbertoAcuña JavaScript 不能很好地处理正则表达式中的 Unicode 字符,因此 \b 序列将不起作用。相反,使用以下代码将字符串拆分为一个或多个空格字符会更容易:'Hi I am acuña'.split(/\s+/);.
    【解决方案4】:

    如下使用正则表达式模式\w+(\s+\w+)*

    m = s.match(/\w+(\s+\w+)*/g);
    

    【讨论】:

    • 上帝,不。这种模式只是在等待灾难性的回溯。使用/\w([\w\s]*\w)?/
    • @FrankieTheKneeMan - 你在开玩笑吧?这种模式很好。
    • @Ωmega - 该模式在技术上是正确的,但由于灾难性的回溯而危险。嵌套量词是一件危险的事情,尤其是在像 Javascript 这样低效的语言中。 regular-expressions.info/catastrophic.html这篇文章很好地介绍了这个想法。
    • @FrankieTheKneeMan - 嘿,孩子。你不必教我,我知道几十年来灾难性的回溯是什么,但在这种情况下是不可能的。
    【解决方案5】:

    简单。匹配所有非空白字符组

    var str = "Hi I   am   Bob";
    
    var matches = str.match(/[^ ]+/g); // => ["Hi", "I", "am", "Bob"]
    

    【讨论】:

      【解决方案6】:

      你的正则表达式正在做的是:

      /([a-zA-Z0-9_]{1,}[ \r\v\n\t\f]{0,}){0,}/
      

      也就是说,找到一个或多个 A 到 Z 的第一个匹配项,包括数字和下划线,然后是零个或多个空格字符:

      • 空格字符
      • 回车符
      • 垂直制表符
      • 换行符
      • 制表符
      • 换页符

      然后是零个或多个 A 到 Z 与数字和下划线一起打扰小写和大写。

      \s 不仅仅匹配简单的空格,您可以输入文字空格,它会起作用。

      我相信你想要:

      /(\w+ +\w+)/g
      

      all 匹配 A 到 Z 中的一个或多个,以及数字和下划线,后跟 一个 或多个空格,然后是一个或更多的 A 到 Z 与数字和下划线一起影响上下。

      这将匹配所有由空格分隔的单词字符

      如果您只想查找所有单词字符簇,没有标点符号或空格,那么您可以使用:

      /(\w+)/g
      

      这将找到所有组合在一起的单词字符

      【讨论】:

        【解决方案7】:
        var regex=/\w+\s+/g;
        

        现场演示:http://jsfiddle.net/GngWn/

        [更新] 我只是在回答这个问题,但根据 cmets,这更有可能是您要查找的内容:

        var regex=/\b\w+\b/g;
        

        \b 是单词边界。

        演示:http://jsfiddle.net/GngWn/2/

        [Update2] 您的编辑使它成为一个完全不同的问题:

        string.replace(/\[\[do "([\s\S]+)"\]\]/,'cool("$1")');
        

        演示:http://jsfiddle.net/GngWn/3/

        【讨论】:

        • 最后的“Bob”在哪里? :) 或者我误解了这个问题?
        • 这将包括尾随空格(如果存在),这可能是不需要的 (jsfiddle.net/GngWn/1)
        • @VisioN 我只是在回答这个问题:“用单个或多个空格匹配所有单词”最后一个 Bob 不是其中之一。
        • @Ωmega 同样的评论,我只是在回答这个问题,你可能是对的。
        猜你喜欢
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 2013-07-09
        • 2013-09-21
        相关资源
        最近更新 更多