【问题标题】:Regex to not match when not in quotes不在引号中时正则表达式不匹配
【发布时间】:2014-06-29 11:36:56
【问题描述】:

我正在寻找一个匹配双空格的 JS 正则表达式

([-!$%^&*()_+|~=`{}\[\]:";'<>?,.\w\/]\s\s[^\s])

RegEx 应该匹配双空格(不包括行首或行尾,用引号括起来时)。

对此的任何帮助将不胜感激。

例如:

var x = 1,
    Y = 2;

在哪里都可以

var x =  1;

不会(= 符号后超过一个空格。

如果是的话

console.log("I am some console  output");

在双引号内就可以了

【问题讨论】:

  • 相关列表中有许多类似的问题。在发布您的问题之前,您是否尝试过其中任何一个?
  • 你想对比赛做什么?删除或替换双空格?找到职位了吗?
  • @try-catch-finally 我希望这个编辑能满足你的需要

标签: javascript regex


【解决方案1】:

这个问题是这个问题中向"regex-match a pattern, excluding..."解释的技术的经典案例

我们可以用一个漂亮简单的正则表达式来解决它:

(["'])  \1|([ ]{2})

交替的左侧| 匹配完整的' '" "。我们将忽略这些匹配。右侧匹配并捕获第 2 组的双空格,我们知道它们是正确的,因为它们没有被左侧的表达式匹配。

这个程序展示了如何在 JavaScript 中使用正则表达式,我们将在其中检索第 2 组捕获:

var the_captures = []; 
var string = 'your_test_string'
var myregex = /(["'])  \1|([ ]{2})/g;
var thematch = myregex.exec(string);
while (thematch != null) {
    // add it to array of captures
    the_captures.push(thematch[2]);
    document.write(thematch[2],"<br />");    
    // match the next one
    thematch = myregex.exec(string);
}

Perl 和 PCRE 的简洁变体

在原来的答案中,我没有注意到这是一个JavaScript问题(标签是后来添加的),所以我给出了这个解决方案:

(["'])  \1(*SKIP)(*FAIL)|[ ]{2} 

在这里,感谢(*SKIP)(*FAIL)魔法,我们可以直接匹配空格,无需捕获组。

demo

参考

【讨论】:

  • 如果是“requirements are not entirely clear to [you]”,您应该考虑首先在 cmets 部分寻求澄清,而不是肤浅的回答。 (编辑:反对票是我的;)
  • 这似乎仍然匹配 console.log('should allow multiple Spaces 1!')
  • @NickWhite 这不是关于比赛,而是关于第 2 组的捕获。代码检索第 2 组。这是一种“跳过”技术,可以匹配我们不想要的内容,以捕获我们想要的内容。将添加解释。请查看示例代码。
  • 代码还不能工作:您正在创建regex,但使用myregex。并且仍然不清楚(显然不仅对我而言)尼克怀特期望什么。提示:您可以使用头控while 备用一个exec()do { ... } while (...); :)
  • @try-catch-finally regex vs. myregex = 很好,谢谢。 :) 看看答案...如果您仍然认为它应该被否决,那么您的标准非常高,我需要从您的答案中学习。 :)
【解决方案2】:

简单的解决方案:

/\s{2,}/

这匹配所有出现的一个或多个空白字符。如果您需要匹配整行,但前提是它包含两个或多个连续的空白字符:

/^.*\s{2,}.*$/

如果空格不需要连续:

/^(.*\s.*){2,}$/

【讨论】:

  • 您的正则表达式在哪里避免匹配引号内的空格?
  • 问题中的正则表达式确保它也不匹配行首的空格
  • 这会忽略引号。出于这个原因-1。
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多