标签: backreference

如何在PHP中查找,增加和替换?

我在表单中有字符串,\d+_\d+我想在第二个数字中添加1.由于我的解释非常清楚,让我举几个例子:

  • 1234567_2应该变为1234567_3
  • 1234_10应该变成1234_11

这是我的第一次尝试:

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)$2)+1, $old);
Run Code Online (Sandbox Code Playgroud)

这会导致语法错误:

解析错误:语法错误,意外T_LNUMBER,在[...] 201行上预期T_VARIABLE或'$'

这是我的第二次尝试

$new = preg_replace("/(\d+)_(\d+)/", "$1_".("$2"+1), $old);
Run Code Online (Sandbox Code Playgroud)

这会将$ old = 1234567_2转换为$ new = 1234567_1,这不是所需的效果

我的第三次尝试

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)"$2"+1), $old);
Run Code Online (Sandbox Code Playgroud)

这产生了同样的结果.

通过做这些尝试,我意识到我不明白新的$ 1,$ 2,$ 3,..变量是如何工作的,所以我真的不知道还有什么可以尝试,因为看起来这些变量在退出时不再存在preg_replace函数...

有任何想法吗?

php regex backreference preg-replace

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

正则表达式,带有preg_match_all的模式中的反向引用问题

我想知道这里的反向引用有什么问题:

preg_match_all('/__\((\'|")([^\1]+)\1/', "__('match this') . 'not this'", $matches);
Run Code Online (Sandbox Code Playgroud)

它应该匹配__('')之间的字符串,但实际上它返回:

match this') . 'not this
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

php regex backreference preg-match-all

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

用大括号包裹数字的正则表达式?

我正在尝试使用Python re.sub()将字符串与e字符匹配,并在e字符后面和lastdigit后立即插入花括号.例如:

12.34e56 to 12.34e{56}
1e10 to 1e{10}
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到正确的正则表达式插入所需的花括号.例如,我可以像这样正确插入左括号:

>>> import re
>>> x = '12.34e10'
>>> pattern = re.compile(r'(e)')
>>> sub = z = re.sub(pattern, "\1e{", x)
>>> print(sub)
    12.34e{10 # this is the correct placement for the left brace
Run Code Online (Sandbox Code Playgroud)

使用两个反向引用时出现问题.

>>> import re
>>> x = '12.34e10'
>>> pattern = re.compile(r'(e).+($)')
>>> sub = z = re.sub(pattern, "\1e{\2}", x)
>>> print(sub)
    12.34e{} # this is not what I want, digits 10 have been …
Run Code Online (Sandbox Code Playgroud)

python regex backreference

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

Java - 数组中的Regex反向引用

有没有办法使用正则表达式拆分Java String并返回反向引用数组?

举个简单的例子,我想从简单的电子邮件地址(仅限字母)中提取用户名和提供商.

String pattern = "([a-z]+)@([a-z]+)\\.([a-z]{3})";
String email = "user@email.com";

String[] backrefs = backrefs(email,pattern);

System.out.println(backrefs[0]);
System.out.println(backrefs[1]);
System.out.println(backrefs[2]);
Run Code Online (Sandbox Code Playgroud)

这应该输出

user
email
com
Run Code Online (Sandbox Code Playgroud)

java regex backreference

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

javascript正则表达式模式中的反向引用

我可以找到很多的信息有关获取在JavaScript正则表达式的捕获组replace功能,使用$1,$2等等.但我真正需要的是反向引用捕获组在正则表达式本身的一种方式.

我需要将以下三个字符串与一个正则表达式匹配:

<--text-->
<**text**>
<++text++>
Run Code Online (Sandbox Code Playgroud)

text实际上在哪里[a-zA-Z]+.

我已经在Ruby中使用了这种模式:

/<([-+*]{2})(.+)\1>/
Run Code Online (Sandbox Code Playgroud)

别介意我(.+)在这里使用,但我很想知道如何\1在javascript中实现反向引用.有任何想法吗?

javascript regex backreference

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

无法使Python正则表达式反向引用工作

我想匹配Python文件的文档字符串.例如.

r""" Hello this is Foo
     """
Run Code Online (Sandbox Code Playgroud)

使用只"""应该足够开始.

>>> data = 'r""" Hello this is Foo\n     """'
>>> def display(m):
...     if not m:
...             return None
...     else:
...             return '<Match: %r, groups=%r>' % (m.group(), m.groups())
...
>>> import re
>>> print display(re.match('r?"""(.*?)"""', data, re.S))
<Match: 'r""" Hello this is Foo\n     """', groups=(' Hello this is Foo\n     ',)>
>>> print display(re.match('r?(""")(.*?)\1', data, re.S))
None
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么第一个表达式匹配而另一个不匹配?

python regex backreference

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

正则表达式修改反向引用的值

有没有办法修改反向引用的值?

示例:在以下文本中

"this is a test"
Run Code Online (Sandbox Code Playgroud)

应该通过反向引用提取“测试”一词并插入到另一个文本中。

正则表达式:

(test)
Run Code Online (Sandbox Code Playgroud)

替代品:

"this is another \1"
Run Code Online (Sandbox Code Playgroud)

到目前为止效果很好。但现在的问题是,是否可以在插入之前修改反向引用。类似于将单词“test”转换为大写。

我认为它可能看起来像:

"this is another \to_upper\1"
Run Code Online (Sandbox Code Playgroud)

正则表达式的“标准”(是否有任何标准?)中是否定义了某些内容?

regex backreference

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

无法使用sed进行分组

这按预期工作:

INPUT FILE src.txt:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp
Run Code Online (Sandbox Code Playgroud)

命令:

sed 's/-i .*\./XXX/' <src.txt
Run Code Online (Sandbox Code Playgroud)

结果如预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp
Run Code Online (Sandbox Code Playgroud)

那么为什么这些不能按预期工作:

命令:

sed 's/-i (.*)\./XXX/' <src.txt
Run Code Online (Sandbox Code Playgroud)

预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp
Run Code Online (Sandbox Code Playgroud)

实际结果:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp
Run Code Online (Sandbox Code Playgroud)

命令:

sed 's/-i (.*)\.3gp/\1.mp3/' <src.txt
Run Code Online (Sandbox Code Playgroud)

预期:

ffmpeg uno.mp3
ffmpeg dos.mp3
ffmpeg tres.mp3
Run Code Online (Sandbox Code Playgroud)

实际结果

sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

括号似乎不适用于分组,但我发现的所有教程和示例似乎都认为它们应该......

regex grouping backreference sed parentheses

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

对可选捕获子表达式的模式反向引用

尝试使用Bash内置的正则表达式匹配来解析以下类型的字符串,这些字符串将被转换为Perl替换表达式(引号不是数据的一部分)

'~#A#B#'
#^ ^ ^-- Replacement string.
#| +---- Pattern string.
#+------ Regular expression indicator (no need to escape strings A and B),
#        which is only allowed if strings A and B are surrounded with ##.
#        Strings A and B may not contain #, but are allowed to have ~.

'#A#B#'
#^------ When regex indicator is missing, strings A and B will be escaped.

'A#B'
#        Simplified form of '#A#B#', i. e. without the enclosing ##.
#        Still …
Run Code Online (Sandbox Code Playgroud)

regex bash backreference

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

Vim正则表达式,反向引用`[^ ​​s]`匹配

在一个文件中,例如:

self.phrase
self.phrases
self.phrase.lower()
self.phrase_lowered
self.phrases[self.phrase]
Run Code Online (Sandbox Code Playgroud)

我想更换所有self.phraseself._phrase,除了self.phrases可以得到:

self._phrase
self.phrases
self._phrase.lower()
self._phrase_lowered
self.phrases[self._phrase]
Run Code Online (Sandbox Code Playgroud)

在我试过的正则表达式中,第一个(我认为可行的正则表达式)是:

:%s/self\.phrase[^s]/self\._phrase\1/gc
Run Code Online (Sandbox Code Playgroud)

但它没有用.

regex vim backreference

0
推荐指数
1
解决办法
231
查看次数