草庐IT

Javascript 正则表达式匹配捕获返回整个匹配,而不是组

coder 2024-05-13 原文

re = /\s{1,}(male)\.$/gi

"A girl is a female, and a boy is a male.".match(re);

这会导致“男性”。

我要的是“男”

我将男性放在括号中,我认为这只会包含那个群体。

感谢帮助

最佳答案

我知道这个问题很老了但是这里的所有答案都是完全错误的。真正让我感到困扰的是,这些答案并没有给社区带来任何有用的东西。

首先

问题:为什么正则表达式的结果是 "male."

re = /\s{1,}(male)\.$/gi

"A girl is a female, and a boy is a male.".match(re);

答案:因为,"male."是唯一的匹配项。

问题:为什么 (male) 没有返回?

答案:因为当使用 g 标志时,match() 不会返回捕获的组。

来自文档:

If the regular expression includes the g flag, the method returns an Array containing all matched substrings rather than match objects. Captured groups are not returned. If there were no matches, the method returns null.

第二

让我们分解正则表达式并找出它真正匹配的模式。

模式

  • \s{1,} 表示匹配至少一个空格。这与 \s+
  • (male)表示匹配male并捕获。
  • \.$ 表示匹配输入末尾的句点。

标记

  • g 表示查找所有匹配项而不是在第一个匹配项后停止
  • i 表示忽略大小写

但是,所有这些模式都粘在一起。这些模式并不能独立存在。

正则表达式匹配的是:一个空格后跟“male”,然后是输入末尾的 .。在示例中,输入的唯一匹配部分是 "male."

第三

那么,当我们移除 g 标志时会发生什么?

If the string matches the expression, it will return an Array containing the entire matched string as the first element, followed by any results captured in parentheses. If there were no matches, null is returned.

If the regular expression does not include the g flag, str.match() will return the same result as RegExp.exec(). The returned Array has an extra input property, which contains the original string that was parsed. In addition, it has an index property, which represents the zero-based index of the match in the string.

re = /\s{1,}(male)\.$/i

"A girl is a female, and a boy is a male.".match(re);

新结果是一个具有一些额外属性的数组:索引和输入。

res: Array(2)
    0 : " male."
    1 : "male"
    groups : undefined
    index : 34
    input : "A girl is a female, and a boy is a male."
    length : 2

很容易操纵该结果以获得您想要的结果。然而....

第四个

我真的、真的、真的希望正则表达式只返回 "male"。你猜怎么着,你真的可以用纯正则表达式做到这一点。

re = /male(?=\.$)(?!=[^\b])/gi


"A girl is a female, and a boy is a male.".match(re);

这导致“男性”;正是提问者所要求的。

注意到 g 标志又回来了吗?在此示例中没有区别,但稍后会有所不同。

让我们分解一下:

  • male 匹配male;呃。
  • (?=\.$) 表示仅当输入末尾跟有 . 时才匹配前一个模式。
  • (?!=[^\b]) 表示匹配前面的模式,如果它前面有一个空白字符。

把它们放在一起,male(?=\.$)(?!=[^\b]) 表示匹配 male 如果它在输入的末尾跟一个句点并匹配male 如果它前面有一个空白字符。

终于

g 标志呢?我们能看到它做点什么吗?

正如之前用户所说,\.$ 使 g 标志变得无关紧要,因为输入字符只能有一个结尾;与匹配无关,因为我们看到它影响 macth() 的输出。

如果我们将输入更改为 A girl is a female, and a boy is a male 会怎样?女喜欢好男。

摆脱 $ 并看到 g 标志起作用,它很神奇。

re = /male(?=\.)(?!=[^\b])/ig

res = "A girl is a female, and a boy is a male. A female likes a good male.".match(re);

现在,输出是一个包含只是 匹配项的数组! ['男性','男性']

我现在感觉好多了。

关于Javascript 正则表达式匹配捕获返回整个匹配,而不是组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5264701/

有关Javascript 正则表达式匹配捕获返回整个匹配,而不是组的更多相关文章

  1. 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

  2. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  3. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  4. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  5. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  6. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

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

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

  8. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  9. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

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

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

随机推荐