问题标签 [regex-group]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
regex - Powershell:用变量替换正则表达式命名组
假设我有一个如下所示的正则表达式,但我将它从文件加载到变量 $regex 中,因此在设计时不知道它的内容是什么,但在运行时我可以发现它包含“version1”, “version2”、“version3”和“version4”命名组:
...我有这些变量:
...我在文件中遇到以下字符串:
...存储在变量 $input 中,因此 ($input -match $regex) 的计算结果为 $true。
如果我不知道它们在 $regex 中出现的顺序(我只知道 $正则表达式包括这些命名组)?
我找不到任何描述通过使用组名作为匹配索引将命名组替换为变量值的语法的参考 - 这甚至受支持吗?
编辑: 澄清 - 目标是替换任何类型的文本文件中的模板化版本字符串,其中给定文件中的版本字符串需要替换可变数量的版本字段(可能是 2、3 或所有 4 个字段)。例如,文件中的文本可能看起来像以下任何一种(但不限于这些):
用户可以指定一个文件集和一个正则表达式来匹配包含字段的行,最初的想法是各个字段将被命名组捕获。该实用程序具有应在文件中替换的各个版本字段值,但必须保留将包含替换的行的原始格式,并且仅替换请求的字段。
EDIT-2: 我认为我可以通过基于每个匹配项的位置和范围的子字符串计算得到我需要的结果,但希望 Powershell 的替换操作能够为我节省一些工作。
EDIT-3: 因此,正如 Ansgar 在下面正确而简洁地描述的那样,没有办法(仅使用原始输入字符串、您只知道命名组的正则表达式以及结果匹配项)使用“- replace" 操作(或其他正则表达式操作)来执行命名组的捕获的替换,同时保持原始字符串的其余部分不变。对于这个问题,如果有人好奇,我最终使用了下面的解决方案。YMMV,其他可能的解决方案。非常感谢 Ansgar 提供的反馈和选项。
在以下代码块中:
- $input 是要执行替换的文本行
- $regex 是从已验证包含至少一个受支持的命名组的文件中读取的正则表达式([string] 类型)
- $regexToGroupName 是一个哈希表,它将一个正则表达式字符串映射到一个组名数组,该数组按照 [regex]::GetGroupNames() 返回的数组的顺序排列,与它们出现的从左到右的顺序相匹配表达方式
- $groupNameToVersionNumber 是一个将组名映射到版本号的哈希表。
$regex 中命名组的约束只是(我认为)命名组中的表达式不能嵌套,并且应该在输入字符串中最多匹配一次。
python - python regex:多次匹配一个组
我知道有更好或更简单的方法可以做到这一点,但是当我自己尝试过但没有奏效时,我很感兴趣为什么,所以这里有问题:
假设我想使用正则表达式获取 Xml 属性。让我们看看下面的 XML-Node:
解析Node
以及OtherNode
我有以下正则表达式:
的输出pattern.findall(xml)
是:
('Node', 'key2="val2"', 'key2', 'val2') ('OtherNode', '', '', '')
和输出[m.groupdict() for m in pattern.finditer(xml)]
:
似乎只有最后一个元变量可以作为组访问。
如何搭配key1
以及key2
?是否可以将多个组与(...)*
构造匹配?换句话说:meta
如果存在,我希望正则表达式多次匹配命名组。
c# - 正则表达式一次查找多个匹配项
所以这里是字符串:“DC:PPE Env:CH1 Slice:whatever to extract”或“babaasdfsd DC:PPE asdfas Env:CH1 or Slice:whatever”
基本上我试图找到“DC:PPE”“Env:CH1”“Slice:whatever”并删除它们。
我正在使用以下正则表达式:(c#)
(?:^|\s+)
我正在尝试匹配 Slice|Env|Dc 出现在开头或带有前导空格。我.*?\s+
试图非贪婪地匹配 DC:PPE 之后的空格。
我希望它同时返回所有三场比赛。这有什么问题?
java - 正则表达式第 n 个匹配字符串
是否可以仅使用正则表达式(无需额外代码!)来匹配第 n 个匹配项?例如:
“汽车”-“火车”-“船”-“自行车”
现在我只想匹配 BOAT,匹配的正则表达式是“[AZ]+”,但这也匹配第一个、第二个和第四个。
有没有人为此提供纯正则表达式解决方案?我需要这个,因为我无法更改使用正则表达式的代码,但我可以提供一个正则表达式。
最好的问候,罗宾
java - 正则表达式解析可能由或不由 ; 分隔的字符串 分成几组
我有一个案例,我需要根据一个标准将一个字符串解析为几个组
例如下面的;
应该是2组
请注意,我不关心开头的 01,并且可以有 0 个或多个由 ; 分隔的子字符串。我需要他们都在他们自己的小组中。
另一个;
应该是3组:
基本上,我不需要关心字母或数字是第一位的。问题是将表达式分组为自己的,可以是 0 次或更多次。意思如下
还应该产生一组%3A%35r%07%01P%88%00
python - RegExp 组引用上的特殊字符结果错误
我的错误是什么?
我能怎么做 ?
java - 日期的正则表达式省略了月份部分的一个字符
这很奇怪,因为它是非常简单的dd/mm
格式正则表达式。结果应该是:"Group 1: 14; Group 2: 12"
但它是"Group 1: 14; Group 2: 1"
。
第二组只捕获了第一个字符,但省略了第二个字符(示例中为“2”)。
我不明白为什么。请你帮助我好吗?
python - 一个简单的 python 正则表达式中的可选分组
我想要做的就是在一个字符串中搜索两个连续数字的实例。如果找到这样的实例,我想对它进行分组,否则为该特定组返回 none。我认为这将是微不足道的,但我不明白我要去哪里错了。在下面的示例中,删除可选 (?) 字符会得到数字,但在没有数字的字符串中,r
计算结果为 None,因此 r.groups() 会引发异常。
# --- update/clarification --- #
感谢您的回答,但给出的解释让我一无所知。这是另一个准确指出我不明白的地方的方法。
我明白为什么result.group()
会产生结果,但为什么不result.groups()
产生('A', )
?我认为它是这样工作的:一旦正则表达式命中z
它,然后使用.*
. 尽管.*
匹配所有内容,正则表达式引擎知道它传递了一个可选组,并且由于?
意味着它会尝试匹配,如果可以,它应该向后工作以尝试匹配。替换?
为+
确实返回('A', )
。这表明?
如果没有必要,它不会尝试匹配,但这似乎与我读过的关于该主题的大部分内容(尤其是 J. Friedl 的优秀书籍)形成鲜明对比。
regex - 这个用于电子邮件地址验证的正则表达式如何工作?
在搜索用于电子邮件地址验证的正则表达式时,我遇到了这个页面:http ://www.regular-expressions.info/email.html 。我无法理解。
它说: \b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+.)+[AZ]{2,4}\b 将匹配 john@server。 department.company.com 但不是 john@aol...com。
你能(?:[A-Z0-9-]+\.)
详细解释一下它是如何工作的,以及它是如何不匹配john@aol...com
和匹配另一个的吗?
javascript - 如何量化 Javascript 正则表达式中的组?
假设我有一个字符串“QQxaxbxcQQ”,我想捕获所有 x 组,后跟任何字符。我也只想在QQ之间搜索(字符串中可能包含其他内容)。我认为这会奏效:
然而,这似乎只是让我回到最后一场比赛(xc)。你能为我指出正确的方向吗?
编辑:我的问题的第一个版本过于简单化了。向原始响应者道歉。编辑以使其更接近我的实际问题。