标签: capturing-group

Javascript RegExp非捕获组

我正在编写一组RegExps来将CSS选择器转换为id和类的数组.

例如,我希望'#foo #bar'返回['foo','bar'].

我一直在努力实现这一目标

"#foo#bar".match(/((?:#)[a-zA-Z0-9\-_]*)/g)
Run Code Online (Sandbox Code Playgroud)

但是当非捕获前缀?:应该忽略#字符时,它返回['#foo','#bar'].

有没有比切片返回的每个字符串更好的解决方案?

javascript regex regex-group capturing-group

11
推荐指数
2
解决办法
6159
查看次数

重新上传捕获组

re.sub('a(b)','d','abc')收益率dc,而不是adc.那么为什么不re.sub理解这里的捕获组呢?

python regex replace capturing-group python-3.x

8
推荐指数
2
解决办法
1万
查看次数

SQL查找并替换正则表达式捕获组限制?

我需要将电子表格中的数据转换为SQL中的insert语句.我已经解决了大多数正则表达式在SSMS中使用查找和替换工具,但是当我尝试在我的最终替换中引用第9个带括号的项目时,我遇到了一个问题.

这是原始记录:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012
Run Code Online (Sandbox Code Playgroud)

这就是我需要的(现在):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101'
Run Code Online (Sandbox Code Playgroud)

由于允许括号项目数量的限制,我必须经历三次替换.如果我可以首先将此工作作为POC,这可能适用于存储过程.

这是第一个匹配的表达式:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z}
Run Code Online (Sandbox Code Playgroud)

并取代: \10\2/0\3/\40\5/0\6/\7

这会在月份和日期中添加零,以便它们至少包含两个字符.

下一个匹配将日期重新格式化为查询中所需的格式(没有关于不使用日期字段的注释.这是数据库的客户端要求).

匹配表达式:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}
Run Code Online (Sandbox Code Playgroud)

并取代: \1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

最后,最终匹配将结果插入将在insert语句中使用的SQL语句.

匹配表达式:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z}
Run Code Online (Sandbox Code Playgroud)

并取代: select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

除最后一次更换外,一切正常.出于某种原因,\ 9不会从匹配中获取数据.如果我只用\ 9替换整个替换表达式,我会得到一个空格.如果我使用\ 8,我得到N.如果我消除了第8个带括号的项目,从而使我的第9个项目成为第8个,它返回我想要的,20120101.

所以我的问题是,当使用find/replace和正则表达式时,SSMS/SQL是否允许使用9个带标记的表达式?或者我在这里遗漏了什么?我知道还有其他方法可以做到这一点.我只是想把它作为POC快速完成,然后我们将它移到一个sproc或应用程序中.

谢谢你的帮助.-Peter

regex sql replace sql-server-2008 capturing-group

6
推荐指数
1
解决办法
2867
查看次数

使用正则表达式,组捕获和反向引用查找和替换

我正在尝试在SQL Server 2008 R2 Management Studio中执行查找和替换操作,并使用组捕获,以便我可以返回引用替换中的组.据我所知,从这个是SSMS使用的Visual Studio 2005的正则表达式引擎.这是我的一个例子:

SELECT First FROM Table1
SELECT Second FROM Table2
SELECT Third FROM Table3
Run Code Online (Sandbox Code Playgroud)

这是我的"查找"表达式:

SELECT (.+) FROM (.+)
Run Code Online (Sandbox Code Playgroud)

这是我的"替换"表达式:

\1 \2
Run Code Online (Sandbox Code Playgroud)

但是,运行替换操作会导致没有返回捕获的组,即每行只是""(<---只是两个反向引用之间的空格).

我究竟做错了什么?

regex ssms replace sql-server-2008-r2 capturing-group

6
推荐指数
2
解决办法
2816
查看次数

捕获组的负向前瞻

我正在尝试这个挑战:

https://regex.alf.nu/4

我想匹配所有不包含ABBA模式的字符串.

比赛:

aesthophysiology
amphimictical
baruria
calomorphic
Run Code Online (Sandbox Code Playgroud)

不匹配

anallagmatic
bassarisk
chorioallantois
coccomyces
abba
Run Code Online (Sandbox Code Playgroud)

首先,我有一个正则表达式来确定ABBA模式.

(\w)(\w)\2\1
Run Code Online (Sandbox Code Playgroud)

接下来我想匹配不包含该模式的字符串:

^((?!(\w)(\w)\2\1).)*$
Run Code Online (Sandbox Code Playgroud)

然而,这符合一切.

如果我通过为负前瞻指定文字来简化这一点:

^((?!agm).)*$
Run Code Online (Sandbox Code Playgroud)

正则表达式与字符串"anallagmatic"不匹配,这是期望的行为.

因此看起来问题在于我在负向前瞻中使用捕获组和反向引用.

regex backreference regex-negation capturing-group regex-lookarounds

6
推荐指数
1
解决办法
3802
查看次数

如果在给定序列中多次出现任何模式,如何使用正则表达式进行匹配

很难正确地说出这个词,但是TL; DR。

我想在给定的文本句子中匹配(假设“树是绿色的”),如果任何空格加倍(或更多)。

例:

"In this text,
THE TREE IS GREEN should not match,
THE  TREE IS GREEN should
and so should THE  TREE   IS GREEN
but  double-spaced  TEXT  SHOULD  NOT BE  FLAGGED outside the pattern."
Run Code Online (Sandbox Code Playgroud)

我最初的方法是

/THE( {2,})TREE( {2,})IS( {2,})GREEN/
Run Code Online (Sandbox Code Playgroud)

但这仅在序列中所有空格均为双精度的情况下才匹配,因此我想使任何组触发完全匹配。我是走错了路吗,还是有办法做到这一点?

regex capturing-group

6
推荐指数
1
解决办法
71
查看次数

Regex that match exactly 3 identical consecutive numbers

Good morning all,

I want to make a regex that match 3 same consecutive numbers. It should match only 3 numbers in a row (separated by a space), the numbers should be identical. If there are less or more than 3 same numbers, then the output should be false

I have tried this regex /.*(\d+) \1 \1(?!(\s\1))/

console.log(/.*(\d+) \1 \1(?!(\s\1))/.test('I am 42 42 4 hey yoo')); //false --> Correct
 
console.log(/.*(\d+) \1 \1(?!(\s\1))/.test('I am 42 42 42 hey yoo')); //true --> …
Run Code Online (Sandbox Code Playgroud)

javascript regex capturing-group

6
推荐指数
1
解决办法
158
查看次数

正则表达式:替换捕获组中的字符

编辑

在正则表达式中,匹配的捕获组是否可以替换为相同的匹配更改(将一个字符替换为另一个字符)?

原问题

我正在将产品列表转换为 CSV 文本文件。列表中的每一行都有:number name[ description] price格式如下:

1 PRODUCT description:120
2 PRODUCT NAME TWO second description, maybe:80
3 THIRD PROD:18
Run Code Online (Sandbox Code Playgroud)


生成的格式还必须包含一个slug(而-不是)作为第二个字段:

1 PRODUCT:product-1:description:120
2 PRODUCT NAME TWO:product-name-two-2:second description, maybe:80
3 THIRD PROD:third-prod-3::18
Run Code Online (Sandbox Code Playgroud)

我正在使用的正则表达式是这样的:

(\d+) ([A-Z ]+?)[ ]?([a-z ,]*):([\d]+)

替换字符串是:

`\1 \2:\L$2-\1:\3:\4
Run Code Online (Sandbox Code Playgroud)

这样我的结果是:

1 PRODUCT:product-1:description:120
2 PRODUCT NAME TWO:product name two-2:second description, maybe:80
3 THIRD PROD:third prod-3::18
Run Code Online (Sandbox Code Playgroud)

-我错过的是第二个字段中需要的分隔符连字符,即\2用“ -”而不是“ ”进行分组。
是否可以使用单个正则表达式,或者我应该进行第二遍?

(目前我使用 Sublime 文本编辑器)

谢谢。

regex capturing-group

5
推荐指数
1
解决办法
6016
查看次数

C++ 正则表达式:获取 SubMatch 匹配的捕获组的索引

语境。我正在开发一个 Lexer/Tokenizing 引擎,它将使用正则表达式作为后端。词法分析器接受定义令牌类型/ID 的规则,例如

<identifier> = "\\b\\w+\\b"

正如我所设想的,为了进行基于正则表达式匹配的标记化,正则表达式定义的所有规则都包含在捕获组中,并且所有组都由 OR 分隔。

当执行匹配时,我们生成的每个匹配都必须有一个与其匹配的捕获组的索引。我们使用这些 ID 将匹配映射到令牌类型。

那么这个问题的问题就出现了——如何获取群组的ID

这里有类似的问题,但它没有为我的具体问题提供解决方案。

正是我的问题,但它是在 JS 中,我需要一个 C/C++ 解决方案。

假设我有一个正则表达式,由用 OR 分隔的捕获组组成:

(\\b[a-zA-Z]+\\b)|(\\b\\d+\\b)

它匹配整数或字母单词。

我的问题要求可以知道正则表达式子匹配匹配的捕获组的索引,例如在匹配字符串时

foo bar 123

将进行 3 次迭代。每次迭代的匹配项的组索引将为0 0 1,因为前两个匹配项与第一个捕获组匹配,最后一个匹配项与第二个捕获组匹配。

我知道在标准std::regex库中这并不完全可能(regex_token_iterator不是解决方案,因为我不需要跳过任何匹配)。

boost::regex我对PCRE 正则表达式库了解不多。

完成这项任务的最佳方法是什么?使用哪个库和方法?

c++ regex tokenize lexer capturing-group

5
推荐指数
1
解决办法
2190
查看次数

在 Perl 中,正则表达式中的捕获组数量是否有限制?

正则表达式中的捕获组数量是否有限制?我曾经认为它是 9 ($1 ... $9),但在 perlre 文档中没有找到任何内容来证实这一点。事实上,下面的代码显示至少有 26 个。

#!/usr/local/bin/perl

use strict;
use warnings;

my $line = " a b c d e f g h i j k l m n o p q r s t u v w x y z ";

my $lp = "(\\w) ";
my $pat = "";
for (my $i=0; $i<26; $i++)
{
   $pat = $pat . $lp;
}

$line =~ /$pat/;
print "$1 $2 $3 $24 $25 $26\n";
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题: How much capture …

regex perl capturing-group

5
推荐指数
2
解决办法
308
查看次数