我试图用Python正则表达式和反向引用实现字符串unescaping,它似乎不想工作得很好.我确定这是我做错了但我无法弄清楚是什么......
>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'
Run Code Online (Sandbox Code Playgroud)
我想用\ [char]替换\\ [char],但是Python中的反向引用似乎没有遵循他们在我曾经使用的每个其他实现中执行的相同规则.有人能解开一些光吗?
在Perl的正则表达式,如表达式\1,\2等通常解释为"反向引用"到先前捕获的组,但不因此当\1,\2等字符类内出现.在后一种情况下,它\被视为转义字符(因此\1只是1等).
因此,如果(例如)想要匹配一个字符串(长度大于1),其第一个字符与其最后一个字符匹配,但不出现在字符串中的任何其他位置,则以下正则表达式不会:
/\A # match beginning of string;
(.) # match and capture first character (referred to subsequently by \1);
[^\1]* # (WRONG) match zero or more characters different from character in \1;
\1 # match \1;
\z # match the end of the string;
/sx # s: let . match newline; x: ignore whitespace, allow comments
Run Code Online (Sandbox Code Playgroud)
将不工作,因为它匹配(例如)字符串'a1a2a':
DB<1> ( …Run Code Online (Sandbox Code Playgroud) 给定包含捕获组(括号)和字符串的正则表达式,如何获得与捕获组匹配的所有子字符串,即通常由"\ 1","\ 2"引用的子字符串?
示例:考虑前缀为"xy"的正则表达式捕获数字:
s <- "xy1234wz98xy567"
r <- "xy(\\d+)"
Run Code Online (Sandbox Code Playgroud)
期望的结果:
[1] "1234" "567"
Run Code Online (Sandbox Code Playgroud)
第一次尝试gregexpr:
regmatches(s,gregexpr(r,s))
#[[1]]
#[1] "xy1234" "xy567"
Run Code Online (Sandbox Code Playgroud)
不是我想要的,因为它返回匹配整个模式的子串.
第二次尝试regexec:
regmatches(s,regexec("xy(\\d+)",s))
#[[1]]
#[1] "xy1234" "1234"
Run Code Online (Sandbox Code Playgroud)
不是我想要的,因为它返回只为整个模式和捕获组匹配第一次出现的.
如果有一个gregexec函数,扩展regexec为gregexpr扩展regexpr,我的问题将得到解决.
所以问题是:如何检索regmatches在任意正则表达式中匹配捕获组的所有子串(或可以传递给上面示例的索引)?
注意:r上面给出的模式只是一个愚蠢的例子,它必须保持随意.
很简单; 我似乎找不到任何关于PHP preg_replace()支持命名反向引用的确定性:
// should match, replace, and output: user/profile/foo
$string = 'user/foo';
echo preg_replace('#^user/(?P<id>[^/]+)$#Di', 'user/profile/(?P=id)', $string);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但我想知道这种语法(?P=name)是否完全不受支持.语法问题,还是不存在的功能?
你能在后视镜中使用反向引用吗?
假设我想split在我身后的任何地方重复两次角色.
String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!
System.out.println(java.util.Arrays.toString(
"Bazooka killed the poor aardvark (yummy!)"
.split(REGEX2)
)); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"
Run Code Online (Sandbox Code Playgroud)
使用REGEX2(其中反向引用嵌套在lookbehind中的前瞻)可以工作,但REGEX1在运行时会出现此错误:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
Run Code Online (Sandbox Code Playgroud)
这个排序是有意义的,我想,因为在一般的反向引用可以捕捉任何长度的字符串(如果正则表达式编译器是有点聪明,但是,它可以判断\1是(.)在这种情况下,因此具有有限的长度).
那么有没有办法在后视镜中使用反向引用?
如果没有,你可以使用这个嵌套的前瞻来解决它吗?还有其他常用技术吗?
我有一个问题TRegEx.replace:
var
Value, Pattern, Replace: string;
begin
Value := 'my_replace_string(4)=my_replace_string(5)';
Pattern := 'my_replace_string\((\d+)\)';
Replace := 'new_value(\1)';
Value := TRegEx.Replace(Value, Pattern, Replace);
ShowMessage(Value);
end;
Run Code Online (Sandbox Code Playgroud)
new_value(4)=new_value(5)我的代码(用Delphi XE4编译)给出了预期的结果new_value(4)=new_value()1)
使用Notepad ++,我得到了预期的结果.
使用命名组可以清楚地看出1是字面意义上的后向引用:
Pattern := 'my_replace_string\((?<name>\d+)\)';
Replace := 'new_value(${name})';
// Result: 'new_value(4)=new_value(){name})'
Run Code Online (Sandbox Code Playgroud)
替换总是那么简单(可能是零次或多次my_replace_string),所以我可以轻松创建自定义搜索和替换功能,但我想知道这里发生了什么.
这是我的错,还是一个错误?
我是Ruby中的正则表达式的新手,我似乎无法找到任何有关其\k<name+0>含义的可靠文档.这+0是我没有得到的部分.
这是一个例子 - 这个Regexp匹配回文:
\A(?<p>(?:(?<l>\w)\g<p>\k<l+0>|\w))\z
Run Code Online (Sandbox Code Playgroud)
当我删除了+0在\k<l+0>它不再正确地匹配.
我的测试:
>> /\A(?<p>(?:(?<l>\w)\g<p>\k<l+0>|\w))\z/.match "aabbcdcbbaa"
#=> #<MatchData "aabbcdcbbaa" p:"aabbcdcbbaa" l:"c">
>> /\A(?<p>(?:(?<l>\w)\g<p>\k<l>|\w))\z/.match "aabbcdcbbaa"
#=> nil
Run Code Online (Sandbox Code Playgroud)
我所做的就是删除+0.我还没有找到任何文件或这方面的例子,有人能指出我正确的方向吗?
我正在学习 Linux 上的 sed s/regexp/replacement/ 命令。
phone.txt 中有一些号码
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(777)555-1217
Run Code Online (Sandbox Code Playgroud)
我想使用正则表达式(我已经在https://www.freeformatter.com/regex-tester.html上测试过)
(\(555\))(.*-)(.*$)
Run Code Online (Sandbox Code Playgroud)
匹配以 (555) 开头的数字。然后我希望这些匹配数字的这三个部分的输出为:(数字 (555)555-1212 的示例)
Area code: (555) Second: 555- Third: 1212
Run Code Online (Sandbox Code Playgroud)
我尝试了以下命令:
cat phone.txt | sed 's/\(\\\(555\\\)\)\(.*-\)\(.*$)/Area code: \1 Second: \2 Third: \3/'
Run Code Online (Sandbox Code Playgroud)
但系统给了我:
sed: -e expression #1, char 66: Unmatched ( or \(
Run Code Online (Sandbox Code Playgroud)
所有数字的通用命令是:
cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area code: \1 Second: \2 Third: \3/'
Run Code Online (Sandbox Code Playgroud)
来源: https: //www.tutorialspoint.com/unix/unix-regular-expressions.htm
但我只想对以 (555) 开头的数字执行 sed ,并通过后向引用将其添加到输出中。
你能告诉我如何正确地编写这个特殊命令吗?
我需要在我的Go代码中匹配使用反向引用的正则表达式(例如\ 1).
这并不是那么容易,因为在Go中,官方的regexp软件包使用RE2引擎,该引擎选择不支持反向引用(以及其他一些鲜为人知的功能),以便可以保证线性时间执行,从而避免使用正则表达式拒绝服务攻击.RE2不支持启用反向引用支持.
在我的代码中,攻击者不存在恶意攻击的风险,我需要反向引用.
我该怎么办?
我第一次在正则表达式中使用捕获组,我想知道我的问题是什么,因为我假设正则表达式引擎从左到右查看字符串.
我正在尝试将UpperCamelCase字符串转换为hyphened-lowercase-string,例如:
HelloWorldThisIsATest => hello-world-this-is-a-test
Run Code Online (Sandbox Code Playgroud)
我的前提条件是字母字符串,所以我不需要担心数字或其他字符.这是我尝试过的:
mb_strtolower(preg_replace('/([A-Za-z])([A-Z])/', '$1-$2', "HelloWorldThisIsATest"));
Run Code Online (Sandbox Code Playgroud)
结果:
hello-world-this-is-atest
Run Code Online (Sandbox Code Playgroud)
这几乎是我想要的,除了a和之间应该有一个连字符test.我已经包含A-Z在我的第一个捕获组中,所以我会假设引擎看到AT并连接了那个.
我究竟做错了什么?
backreference ×10
regex ×10
php ×2
camelcasing ×1
delphi ×1
delphi-xe4 ×1
go ×1
java ×1
linux ×1
lookbehind ×1
perl ×1
preg-replace ×1
python ×1
r ×1
ruby ×1
sed ×1
string ×1