草庐IT

javascript - 正则表达式、组和量化器

coder 2024-04-06 原文

我刚刚在 http://regexcrossword.com/ 做了有趣的正则表达式填字游戏- 发现我不明白量化组的含义,例如(.)+ 或 (.)*

让我试试http://ole.michelsen.dk/tools/regex.html ,它提供了 JavaScript 和 PHP 正则表达式引擎:

要匹配的字符串是“Trololo!” (不带引号)。 (如果打开“全局匹配”改变了什么,它被添加为 primed 版本,即 JS',因为它在 PHP 模式下没有改变任何东西。)

JS,  (.)+ => 0: Trololo! 1: ! 
JS', (.)+ => 0: Trololo! 
PHP, (.)+ => 0: Trololo! 0: ! 
JS,  (.)* => 0: Trololo! 1: ! 
JS', (.)* => 0: Trololo! 
PHP, (.)* => 0: Trololo! 1: 0: ! 1: 
JS,  (.){5} => 0: Trolo 1: o 
JS', (.){5} => 0: Trolo 
PHP, (.){5} => 0: Trolo 0: o 
JS,  (.){4} => 0: Trol 1: l 
JS', (.){4} => 0: Trol 1: olo! 
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: ! 

有什么规范的回答这是什么语义吗?

最佳答案

输出没有正确标记,仅此而已。

首先,应该发生什么?如果您重复一个组,每个新实例都会覆盖最后一次捕获。如果根本不使用该组,它将返回一个空字符串或类似 JS 中的 undefined 的内容(这取决于风格)。 regular-expressions.info 上有一篇很好的文章关于这件事。

现在我们如何获得您的结果?让我们从 JavaScript 开始吧。

所有标记为 JS 的示例(非全局示例)都符合上述描述。它们匹配 0 中所需数量的字符并捕获 1 中的最后一个字符。所以我们可以忽略这些。

全局的有什么用?这里的输出被错误地解释了。当您将全局标志与 String.match() 函数一起使用时,您不会再获得所有捕获的数组 - 但只会获得所有匹配项的数组(组 0 每场比赛)。因此,在 +*{5} 只有一个匹配项的情况下,您只能得到一个结果。对于 {4},目标字符串中有足够的空间容纳两个匹配项,因此生成的数组包含两个元素。要使用全局标志获取所有捕获,您需要编写一个循环并改用 RegExp.exec()(它一次为您提供一个匹配项,但它的所有捕获)。

PHP 有什么用?看起来它正在使用 preg_match_all,无论如何它是全局的,这就是为什么使用 g 没有效果。 + 再次给出您期望的结果。 {5} 也是如此。

另外两个呢?在这里,输出被错误地解释了。默认情况下,preg_match_all 给出一个二维数组,其中第一个索引对应组,第二个索引对应匹配项。在您的输出中,它以相反的方式解释。因此,当存在多个匹配项时,第一对 01 是两个找到的匹配项的完整匹配项。第二对 01 是您在这两场比赛中捕获的内容。

因此对于 *,您首先获得完整的字符串作为匹配项,最后一个字符作为捕获(标记为 0 的两个东西),这是正确的。然后,由于 * 允许零宽度匹配,您会在字符串末尾得到另一个(空)匹配,以及一个空捕获。不过,我不确定为什么相应的 JS' 示例不包含额外的空字符串,因为 String.match 会做同样的事情。

而对于 {4},您只需获得两个匹配项(Trololo!),就像在捕获 l!,同样完美。

关于javascript - 正则表达式、组和量化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933061/

有关javascript - 正则表达式、组和量化器的更多相关文章

  1. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  4. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  5. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  6. ruby - 正则表达式 - 排除一个字符 - 2

    这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:

  7. ruby - 如何遍历 Ruby 中所有正则表达式匹配的字符串? - 2

    我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby​​-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  9. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  10. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

随机推荐