正则表达式引用捕获的组
Regex referencing captured groups
首先,我是 Regex 的新手,如果这是一个愚蠢的问题,我深表歉意。
我只是使用在线正则表达式测试器 https://regex101.com (PCRE) 来构建以下场景。
我想从下面的句子中截取123445
和ABC1234
Foo Bar 123445 Ref ABC1234
我只是想使用一个简单的捕获组
((?:\w)+)
这将识别 5 个匹配组然后我可以用 </code> 和 <code>
反向引用它
然而,当我尝试仅对一组 </code> 使用 Substitution 时,我最终得到了整个字符串。我尝试了其他一些语言,结果是 </p>
<p><code>
最后我只使用了 Foo\s*Bar\s*(\w+)\s*Ref\s*(\w+)
和引用组 </code> 和 <code>
,效果很好,但不是很优雅。
是否可以在不围绕您要捕获的每个部分专门构建捕获组的情况下创建这种反向引用?
谢谢:)
((?:\w)+)
Which will identify 5 matching groups And then I could back reference
it with and
不,反向引用不是这样工作的。正则表达式中正好有N组,N是左括号的个数。
在 ((?:\w)+)
中有 2 组,一组 "capturing"(创建反向引用)和一组 "non-capturing"(不创建)。
组在目标字符串中匹配的次数不会改变反向引用的数量。想象一下这将造成的混乱。除了最简单的情况,你怎么知道你要找的是 </code>、<code>
还是 00
?
如果您的输入字符串具有固定结构,那么您的方法 Foo\s*Bar\s*(\w+)\s*Ref\s*(\w+)
与 </code> 和 <code>
完全没问题。
Is it possible to create this kind of back referencing without
specifically building capturing groups around each part of what you
are trying to capture?
没有。您必须为每个要反向引用的部分构建一个捕获组。如果一个组匹配多次,您将在输入中获取每个匹配项的最后一个实例。
一些正则表达式引擎允许您访问特定组从宿主语言中捕获的每个实例。例如 the .NET regex engine does that。这对 post 处理很好,但是反向引用 本身 (即 </code>)仍然像上面那样工作。</p>
<hr>
<p>综上所述,以您所想的方式从 <code>Foo Bar 123445 Ref ABC1234
中获取 '123445'
和 'ABC1234'
的方法是避免使用正则表达式和 string.split()
space,包括第 2 部分和第 3 部分。
根据您的问题,不完全清楚您要匹配的内容以及要替换的内容。
为了尝试为您找到答案,我假设您想匹配任何带有数字的单词并将其替换为其他单词。
\w*?\d+\w*?
将匹配其中包含数字的任何 单词 ,对于 JavaScript(您未指定语言),您执行手动替换,或具有 replacer 功能的动态替换。
const expression = /\b(\w*?\d+\w*?)\b/g;
const inputs = [
'Foo Bar 123445 Ref ABC1234',
'Hello World 123 Foo ABC123XYZ456'
];
// static string
console.log(inputs.map(i => i.replace(expression, '**redacted**')));
// dynamic string
console.log(inputs.map(i => i.replace(expression, s => new Array(s.length).fill('*').join(''))));
首先,我是 Regex 的新手,如果这是一个愚蠢的问题,我深表歉意。
我只是使用在线正则表达式测试器 https://regex101.com (PCRE) 来构建以下场景。
我想从下面的句子中截取123445
和ABC1234
Foo Bar 123445 Ref ABC1234
我只是想使用一个简单的捕获组
((?:\w)+)
这将识别 5 个匹配组然后我可以用 </code> 和 <code>
然而,当我尝试仅对一组 </code> 使用 Substitution 时,我最终得到了整个字符串。我尝试了其他一些语言,结果是 </p>
<p><code>
最后我只使用了 Foo\s*Bar\s*(\w+)\s*Ref\s*(\w+)
和引用组 </code> 和 <code>
,效果很好,但不是很优雅。
是否可以在不围绕您要捕获的每个部分专门构建捕获组的情况下创建这种反向引用?
谢谢:)
((?:\w)+)
Which will identify 5 matching groups And then I could back reference it with and
不,反向引用不是这样工作的。正则表达式中正好有N组,N是左括号的个数。
在 ((?:\w)+)
中有 2 组,一组 "capturing"(创建反向引用)和一组 "non-capturing"(不创建)。
组在目标字符串中匹配的次数不会改变反向引用的数量。想象一下这将造成的混乱。除了最简单的情况,你怎么知道你要找的是 </code>、<code>
还是 00
?
如果您的输入字符串具有固定结构,那么您的方法 Foo\s*Bar\s*(\w+)\s*Ref\s*(\w+)
与 </code> 和 <code>
完全没问题。
Is it possible to create this kind of back referencing without specifically building capturing groups around each part of what you are trying to capture?
没有。您必须为每个要反向引用的部分构建一个捕获组。如果一个组匹配多次,您将在输入中获取每个匹配项的最后一个实例。
一些正则表达式引擎允许您访问特定组从宿主语言中捕获的每个实例。例如 the .NET regex engine does that。这对 post 处理很好,但是反向引用 本身 (即 </code>)仍然像上面那样工作。</p>
<hr>
<p>综上所述,以您所想的方式从 <code>Foo Bar 123445 Ref ABC1234
中获取 '123445'
和 'ABC1234'
的方法是避免使用正则表达式和 string.split()
space,包括第 2 部分和第 3 部分。
根据您的问题,不完全清楚您要匹配的内容以及要替换的内容。
为了尝试为您找到答案,我假设您想匹配任何带有数字的单词并将其替换为其他单词。
\w*?\d+\w*?
将匹配其中包含数字的任何 单词 ,对于 JavaScript(您未指定语言),您执行手动替换,或具有 replacer 功能的动态替换。
const expression = /\b(\w*?\d+\w*?)\b/g;
const inputs = [
'Foo Bar 123445 Ref ABC1234',
'Hello World 123 Foo ABC123XYZ456'
];
// static string
console.log(inputs.map(i => i.replace(expression, '**redacted**')));
// dynamic string
console.log(inputs.map(i => i.replace(expression, s => new Array(s.length).fill('*').join(''))));