标签: backreference

匹配不均匀的转义符号数

我需要匹配C++预处理器语句.现在,预处理程序语句可能跨越多行:

#define foobar \
    "something glorious"
Run Code Online (Sandbox Code Playgroud)

最终的反斜杠可能会被转义,因此以下结果分为两行:

#define foobar \\
No longer in preprocessor.
Run Code Online (Sandbox Code Playgroud)

问题是如何有效地匹配显式的行继续.我有以下表达式,我认为有效.基本上,它测试反斜杠的数量是否是奇数.它是否正确?可以更有效地完成吗?

/
    [^\\]           # Something that's not an escape character, followed by …
    (?<escape>\\*?) # … any number of escapes, …
    (?P=escape)     # … twice (i.e. an even number).
    \\ \n           # Finally, a backslash and newline.
/x
Run Code Online (Sandbox Code Playgroud)

(我正在使用PHP,所以PCRE规则适用,但我会欣赏任何正则表达式的答案.)

regex backreference pcre

3
推荐指数
1
解决办法
829
查看次数

MySQL REGEXP中的负反向引用

MySQL手册不是很详细,它支持哪些表达式,所以我不确定MySQL是否可以使用以下内容.

我正在尝试使用与以下内容匹配的RLIKE创建查询.

任务是从SQL中获取包含给定句子中至少任意两个单词的所有句子.

比方说,我在正则表达式中使用了一些单词:

hello, dog
Run Code Online (Sandbox Code Playgroud)

我在数据库中有以下句子:

hello from dog
hello hello cat
dog says hello
dog dog goes away
big bad dog
Run Code Online (Sandbox Code Playgroud)

从那些我想要匹配的东西

hello from dog
dog says hello
Run Code Online (Sandbox Code Playgroud)

现在我有这样的:

SELECT *
FROM test
WHERE 
test RLIKE '(hello|dog).*(hello|dog)'
Run Code Online (Sandbox Code Playgroud)

问题是 - 我也得到那些不需要的东西

hello hello cat
dog dog goes away
Run Code Online (Sandbox Code Playgroud)

所以我想,我需要在第二个(你好)之前进行反向引用.

在伪代码中,它看起来像这样:

RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)'
Run Code Online (Sandbox Code Playgroud)

所以它可能像:

'(hello|dog).*(negative backreference to the 1st group …
Run Code Online (Sandbox Code Playgroud)

regex mysql backreference

3
推荐指数
1
解决办法
2146
查看次数

vim替换反斜杠

我试图使用vim脚本从函数声明中仅提取函数名称.出于测试目的,我使用这个简单的例子:

int func(int a);
Run Code Online (Sandbox Code Playgroud)

在vim脚本中,我通过这个提取函数名:

:let a = substitute(getline(line('.')), ".*\(func\).*", "\1", "")
Run Code Online (Sandbox Code Playgroud)

但反向引用不起作用.当我回显变量a时

:echo a
Run Code Online (Sandbox Code Playgroud)

它显示整行,即int func(int a);

如何使用bacreference或任何其他方法仅提取函数名称?

提前致谢!

vim backreference

3
推荐指数
1
解决办法
739
查看次数

将函数应用于R中gsub中的反向引用

我是R的新手,我坚持使用似乎不起作用的反向引用.在:

gsub("\\((\\d+)\\)", f("\\1"), string)
Run Code Online (Sandbox Code Playgroud)

它正确地抓取括号之间的数字,但不应用(正确定义的,否则正常)函数f来替换数字 - >它实际上是传递给f的字符串"\ 1".

我错过了什么或只是R不处理这个?如果是这样,任何想法我怎么能做类似的事情,即将"动态"的函数应用于我正在解析的文本中的括号之间出现的(实际上很多)数字?

非常感谢你的帮助.

backreference r

3
推荐指数
1
解决办法
518
查看次数

R中的反向引用

我对反向引用的使用感到非常困惑

strings <- c("^ab", "ab", "abc", "abd", "abe", "ab 12")

gsub("(ab) 12", "\\1 34", strings)
[1] "^ab"   "ab"    "abc"   "abd"   "abe"   "ab 12"

gsub("(ab)12", "\\2 34", strings)
[1] "^ab"   "ab"    "abc"   "abd"   "abe"   "ab 12"
Run Code Online (Sandbox Code Playgroud)

我知道\ 1表示第一个子模式(从左侧读取),\ 2表示第二个子模式,依此类推。但是我不知道这个子模式是什么意思。为什么\ 1和\ 2给出不同的输出

gsub("(ab)", "\\1 34", strings)
[1] "^ab 34"   "ab 34"    "ab 34c"   "ab 34d"   "ab 34e"   "ab 34 12"
Run Code Online (Sandbox Code Playgroud)

另外,为什么我在(ab)之后删除12,然后得到这样的结果?

gsub("ab", "\\1 34", strings)
[1] "^ 34"   " 34"    " 34c"   " 34d"   " 34e"   " 34 12"
Run Code Online (Sandbox Code Playgroud)

此外,如果ab没有括号怎么办?它表示什么?

我真的搞砸了反向引用,希望有人可以清楚地解释逻辑

backreference r

3
推荐指数
1
解决办法
1926
查看次数

如何用正则表达式替换多个匹配项/组?

通常,我们将编写以下内容替换一个匹配项:

namesRegex = re.compile(r'(is)|(life)', re.I)
replaced = namesRegex.sub(r"butter", "There is no life in the void.")
print(replaced)

output:
There butter no butter in the void.
Run Code Online (Sandbox Code Playgroud)

我想要的是用特定的文本替换每个组,可能使用反向引用。即我想用“ are”代替第一组(is),用“ butterfly”代替第二组(life)。

也许是这样的。但是下面的代码不起作用。

namesRegex = re.compile(r'(is)|(life)', re.I)
replaced = namesRegex.sub(r"(are) (butterflies)", r"\1 \2", "There is no life in the void.")
print(replaced)
Run Code Online (Sandbox Code Playgroud)

有没有办法在python中的一个语句中替换多个组?

python regex backreference

3
推荐指数
1
解决办法
1591
查看次数

Perl模式匹配变量问题

我正在尝试打开一个文件,匹配一个特定的行,然后围绕该行包装HTML标记.看起来非常简单,但显然我缺少一些东西,并且不能正确理解Perl匹配的模式变量.

我跟这个匹配:

$line =~ m/(Number of items:.*)/i;
Run Code Online (Sandbox Code Playgroud)

这使整条线路成为1美元.我尝试打印出我的新行,如下所示:

print "<p>" . $1 . "<\/p>;
Run Code Online (Sandbox Code Playgroud)

我希望它打印出来:

<p>Number of items: 22</p>
Run Code Online (Sandbox Code Playgroud)

但是,我实际上得到了这个:

</p>umber of items: 22
Run Code Online (Sandbox Code Playgroud)

我尝试了各种各样的变化 - 在一个单独的行上打印每个位,使用$ +和$&等将$ 1设置为一个新变量,我总是得到相同的结果.

我错过了什么?

regex perl backreference

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

在Vim中帮助反向引用正则表达式

我试图在vi中编写一个正则表达式来匹配任何空格字符后跟任何数字.然后,在每次匹配时,在空格和数字之间插入一个美元符号.这是一个例子:

A1234 12 14 B1234
B1256 A2 14 C1245
C1234 34 D1 1234K
Run Code Online (Sandbox Code Playgroud)

正确的正则表达式会产生这个:

A1234 $12 $14 B1234
B1256 A2 14 C1245
C1234 $34 D1 $1234K
Run Code Online (Sandbox Code Playgroud)

我意识到我需要使用后向引用,但我似乎无法编写正确的正则表达式.这是我的尝试:

:'<,'>/(\s\d)/\s\1\$/g
Run Code Online (Sandbox Code Playgroud)

此外,我关闭了Vim的默认正则表达式模式(vnoremap / /\v).

谢谢您的帮助.

regex vim backreference

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

使用带有反向引用匹配的 python 正则表达式

我对带有反向引用的正则表达式有疑问。

我需要匹配字符串,我尝试使用这个正则表达式(\w)\1{1,}来捕获我的字符串的重复值,但是这个正则表达式只捕获连续重复的字符串;我坚持改进我的正则表达式以捕获所有重复的值,下面是一些示例:

import re

str = 'capitals'

re.search(r'(\w)\1{1,}', str)
Run Code Online (Sandbox Code Playgroud)

Output None

import re

str = 'butterfly'

re.search(r'(\w)\1{1,}', str)
Run Code Online (Sandbox Code Playgroud)

<_sre.SRE_Match object; span=(2, 4), match='tt'>

python regex backreference

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

无法在 re.sub() repr 表达式的函数调用中使用“\1”反向引用捕获组

我有一个字符串S = '02143'和一个列表A = ['a','b','c','d','e']。我想将 'S' 中的所有数字替换为 list 中相应的元素A

例如,替换0A[0]2withA[2]等。最终输出应该是S = 'acbed'.

我试过:

S = re.sub(r'([0-9])', A[int(r'\g<1>')], S)
Run Code Online (Sandbox Code Playgroud)

然而这会产生错误ValueError: invalid literal for int() with base 10: '\\g<1>'。我猜它正在将反向引用'\g<1>'视为字符串。我该如何解决这个问题,特别是使用re.sub和捕获组,否则呢?

python regex backreference substitution capture-group

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

标签 统计

backreference ×10

regex ×7

python ×3

r ×2

vim ×2

capture-group ×1

mysql ×1

pcre ×1

perl ×1

substitution ×1