【问题标题】:How to split a string with the help of JavaScript's regex?如何在 JavaScript 的正则表达式的帮助下拆分字符串?
【发布时间】:2013-03-21 09:01:10
【问题描述】:

我需要将一个字符串拆分为一个或多个子字符串,每个子字符串包含不超过或少于两个点。例如,如果字符串是foo.boo.coo.too",那么获取以下数组的正则表达式是什么?:["foo.boo.coo", "boo.coo.too"]。我希望有人来回答这个问题——我真的很佩服你,因为我已经编程了好几年了,还没有很好地习惯正则表达式来自己解决这个特殊问题。非常感谢您提前。让我知道您的身份,以便我将您视为我正在创建的程序的贡献者。

【问题讨论】:

  • 这与javascript本身无关,但rubular.com是学习正则表达式基础的非常好的工具。
  • @limelights,你是在告诉我这是不可能用正则表达式完成的吗?为什么不呢?
  • @limelights,或者你所说的“javascript perse”是什么意思?
  • 有人应该可以解决这个问题:jsfiddle.net/mplungjan/AhcTG

标签: javascript regex


【解决方案1】:

RegEx 是解决这个问题的最佳解决方案,这里讨论了类似的问题:split-a-sting-every-3-characters-from-back-javascript

一个好的 javascript 解决方案是这样的 javascript 函数

function splitter(text){
  var parts = text.split(".");
  var times = parts.length - 2;
  var values = [];
  for(var index = 0; index<times;index++)
  {
    values.push(parts.slice(index,index+3).join("."));
  }
  return values;
}

splitter("too.boo.coo.too")
//=> Result tested on Chrome 25+ ["too.boo.coo", "boo.coo.too"]

希望对你有帮助

如果您想使用正则表达式,请尝试 Lookhead Stuff,这可能会有所帮助http://www.regular-expressions.info/lookaround.html

【讨论】:

    【解决方案2】:

    正则表达式本质上会返回不相交的结果,所以如果你想从单个正则表达式中获得“所有匹配” - 这是不可能的。

    所以基本上你需要找到第一个匹配项,然后从下一个位置开始寻找下一个匹配项,依此类推;类似于这里描述的这种技术regex matches with intersection in C#(它不是 JavaScript,但想法是一样的)

    例如,您可以使用以下正则表达式:

    (?<=^|\.)((?:[^.]*\.){2}[^.]*?)(?=$|\.)
    

    它确保它以点开头和结尾,或在行的开头/结尾,并且内部恰好包含两个点,并在第一次捕获时捕获结果。如果需要,您可以将 * 替换为 + 以确保点之间至少存在一个符号。

    但您需要了解,这种方法对于您正在解决的任务的性能确实很差,因此可能使用其他方式(如 split + for)会是更好的解决方案。

    【讨论】:

    • 谢谢!我理解不相交背后的想法。但是您提到的正则表达式示例应该在 JavaScript 中工作吗?你能创建一个 jsfiddle/jsbin 演示吗?
    • 至于糟糕的表现,为什么解决我的任务真的那么糟糕?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多