这本来是一个我想问的问题,但在研究问题的细节时,我找到了解决方案,并认为其他人可能会感兴趣.
在Apache中,完整请求是双引号,并且内部的任何引号始终使用反斜杠进行转义:
1.2.3.4 - - [15/Apr/2005:20:35:37 +0200] "GET /\" foo=bat\" HTTP/1.0" 400 299 "-" "-" "-"
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建一个匹配所有不同字段的正则表达式.我当前的解决方案总是停在GET/ 之后的第一个引号上POST(实际上我只需要包括传输大小的所有值):
^(\d+\.\d+\.\d+\.\d+)\s+[^\s]+\s+[^\s]+\s+\[(\d+)/([A-Za-z]+)/(\d+):(\d+):(\d+):(\d+)\s+\+\d+\]\s+"[^"]+"\s+(\d+)\s+(\d+|-)
Run Code Online (Sandbox Code Playgroud)
我想我也会从我的PHP源代码中提供我的解决方案和更好的格式化解决方案:
$sPattern = ';^' .
# ip address: 1
'(\d+\.\d+\.\d+\.\d+)' .
# ident and user id
'\s+[^\s]+\s+[^\s]+\s+' .
# 2 day/3 month/4 year:5 hh:6 mm:7 ss +timezone
'\[(\d+)/([A-Za-z]+)/(\d+):(\d+):(\d+):(\d+)\s+\+\d+\]' .
# whitespace
'\s+' .
# request uri
'"[^"]+"' .
# whitespace
'\s+' .
# 8 status code
'(\d+)' .
# whitespace
'\s+' .
# 9 bytes sent
'(\d+|-)' …Run Code Online (Sandbox Code Playgroud) 我该如何转换?
ereg_replace(".*\.(.*)$","\\1",$imgfile);
Run Code Online (Sandbox Code Playgroud)
至
preg_replace... ?
Run Code Online (Sandbox Code Playgroud)
?
我遇到了麻烦吗?
我有用户输入,方括号内允许一些标签.我已经编写了正则表达式模式来查找和验证括号内的内容.
在用户输入字段中,开启括号可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠.我需要后视子模式以避免在开括号之前奇数个连续的反斜杠.
目前我必须处理这样的事情:
(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]
Run Code Online (Sandbox Code Playgroud)
它工作正常,但问题是这个代码仍然匹配括号前面可能的连续反斜杠对(即使它们是隐藏的),并且后面只检查是否有另外一个反斜杠附加到对(或直接到开括号) .如果可能的话,我需要在后视组内避免它们.
my [test] string is ok
my \[test] string is wrong
my \\[test] string is ok
my \\\[test] string is wrong
my \\\\[test] string is ok
my \\\\\[test] string is wrong
...
etc
Run Code Online (Sandbox Code Playgroud)
我使用PHP PCRE
考虑这个正则表达式.
a*b
Run Code Online (Sandbox Code Playgroud)
这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
这会使67调试器中的步骤失败.
现在考虑这个正则表达式.
(?>a*)b
Run Code Online (Sandbox Code Playgroud)
这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
这会使133调试器中的步骤失败.
最后这个正则表达式:
a*+b (a variant of atomic group)
Run Code Online (Sandbox Code Playgroud)
这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac
这会使67调试器中的步骤失败.
当我检查基准测试atomic group (?>a*)b执行179%得更快.
现在原子组禁用回溯.所以比赛中的表现很好.
但为什么步数更多呢?有人可以解释一下吗?
为什么会有差异.在两个原子团(?>a*)b和之间的步骤a*+b.
他们的工作方式不同吗
这是一个新手问题,但我希望我能尽可能清楚地表达我的问题.
我正在尝试用C++进行模式匹配.
我从这里下载了WinRE 版本的PCRE,并将下载的pcre3.dll和pcreposix3.dll文件放入Dev-CPP的lib文件夹(我使用的是Bloodshed Dev-C++ 4.9.9 IDE).
我还下载了一个pcrecpp.h头文件,并将它放在同一个目录中,我正在编写以下代码(实际上并没有写.我正在处理一个名为PCRE-Perl Compatible Regular Express的PDF教程中的示例代码).
但我无法让它发挥作用.代码如下:
#include <iostream>
#include <string>
#include <pcrecpp.h>
using namespace std;
int main()
{
int i;
string s;
pcrecpp::RE re("(\\w+):(\\d+)");
if (re.error().length() > 0) {
cout << "PCRE compilation failed with error: " << re.error() << "\n";
}
if (re.PartialMatch("root:1234", &s, &i))
cout << s << " : " << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
当我编译代码时,Dev-C++给了我很多错误,包括:"`pcrecpp'尚未声明"和"RE"未声明.
我该如何处理下载的文件并修复我的问题?或者有什么明显的东西让我失踪?
我有一个像这样的字符串
{{ some text @ other text @ and some other text }} @ this should not be replaced {{ but this should: @ }}
Run Code Online (Sandbox Code Playgroud)
我希望它成为
{{ some text ### other text ### and some other text }} @ this should not be replaced {{ but this should: ### }}
Run Code Online (Sandbox Code Playgroud)
我想这个例子很直接,而且我不确定我能更好地解释我想用文字实现的目标.
我尝试了几种不同的方法但没有效果.
我只是做了一些基准测试,而试图优化一些代码,并指出,strsplit与perl=TRUE是快比跑步strsplit用perl=FALSE.例如,
set.seed(1)
ff <- function() paste(sample(10), collapse= " ")
xx <- replicate(1e5, ff())
system.time(t1 <- strsplit(xx, "[ ]"))
# user system elapsed
# 1.246 0.002 1.268
system.time(t2 <- strsplit(xx, "[ ]", perl=TRUE))
# user system elapsed
# 0.389 0.001 0.392
identical(t1, t2)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
所以我的问题(或者更确切地说是标题中的问题的变体)是,在什么情况下绝对需要perl=FALSE(省略fixed和useBytes参数)?换句话说,我们不能用perl=TRUE它做什么可以通过设置来完成perl=FALSE?
在奇数长度字符串中,您如何匹配(或捕获)中间字符?
这可能与PCRE,普通 Perl或Java正则表达式有关吗?
使用.NET正则表达式,您可以使用平衡组轻松解决它(这可能是一个很好的例子).通过普通的Perl正则表达式,我的意思是不使用任何代码构造(??{ ... }),使用它可以运行任何代码,当然也可以做任何事情.
该字符串可以是任何奇数长度.
例如,在字符串中,12345您需要获取3字符串中心的字符.
这是关于现代正则表达式风格的可能性的问题,而不是以其他方式做到这一点的最佳算法.
在PCRE2或支持前向反向引用的任何其他正则表达式引擎中,是否可以将在先前循环迭代中匹配的捕获组更改为非参与捕获组(也称为未设置捕获组或未捕获组),导致测试该组的条件与其"假"条款相匹配而不是它们的"真实"条款?
例如,采用以下PCRE正则表达式:
^(?:(z)?(?(1)aa|a)){2}
Run Code Online (Sandbox Code Playgroud)
当输入字符串时zaazaa,它根据需要匹配整个字符串.但是当zaaaa我吃饱时,我希望它能够匹配zaaa; 相反,它匹配zaaaa整个字符串.(这只是为了举例说明.当然这个例子可以处理,^(?:zaa|a){2}但不是重点.捕获组擦除的实际用法往往是循环,最常做的远远超过2次迭代.)
这样做的另一种方法,也不能按预期工作:
^(?:(?:z()|())(?:\1aa|\2a)){2}
Run Code Online (Sandbox Code Playgroud)
请注意,当循环"展开"时,这两个都可以正常工作,因为它们不再需要擦除已经进行的捕获:
^(?:(z)?(?(1)aa|a))(?:(z)?(?(2)aa|a))
^(?:(?:z()|())(?:\1aa|\2a))(?:(?:z()|())(?:\3aa|\4a))
Run Code Online (Sandbox Code Playgroud)
因此,不是能够使用最简单的条件形式,而是必须使用更复杂的条件,这只适用于此示例,因为"true"匹配z是非空的:
^(?:(z?)(?(?!.*$\1)aa|a)){2}
Run Code Online (Sandbox Code Playgroud)
或者只使用模拟条件:
^(?:(z?)(?:(?!.*$\1)aa|(?=.*$\1)a)){2}
Run Code Online (Sandbox Code Playgroud)
我已经走遍所有的文件我能找到,而且似乎没有甚至没有提及或这种行为明确描述(即捕获环路内进行通过循环迭代坚持,即使他们失败时,重新拍摄).
它与我的直觉预期不同.我会实现它的方法是,评估捕获组与0次重复将擦除/复位它(这样这可能发生在任何捕获基团与*,?或{0,N}量词),但是跳过它由于内的相同的并行其它替换在上一次迭代中获得捕获的组不会擦除它.因此,如果它们包含至少一个元音,那么这个正则表达式仍将匹配单词:
\b(?:a()|e()|i()|o()|u()|\w)++\1\2\3\4\5\b
Run Code Online (Sandbox Code Playgroud)
但是跳过一个捕获组,因为它位于一个未评估的替代组中,该组使用非零重复进行评估,嵌套在上一次迭代期间捕获组占用一个值的组中,将删除/取消设置它,所以这个正则表达式能够\1在循环的每次迭代中捕获或擦除组:
^(?:(?=a|(b)).(?(1)_))*$
Run Code Online (Sandbox Code Playgroud)
并匹配字符串,如aaab_ab_b_aaaab_ab_aab_b_b_aaa.但是,前向引用的方式实际上是在现有引擎中实现的,它匹配aaaaab_a_b_a_a_b_b_a_b_b_b_.
我想知道这个问题的答案,不仅因为它对构建正则表达式很有用,而且因为我编写了自己的正则表达式引擎,目前ECMAScript兼容一些可选的扩展(包括分子前瞻(?*),即非原子前瞻,据我所知,没有其他引擎有),我想继续添加其他引擎的功能,包括前向/嵌套后向引用.我不仅希望我的前向反向引用的实现与现有实现兼容,而且如果没有一种方法可以在其他引擎中擦除捕获组,我可能会在我的引擎中创建一种不冲突的方法与其他现有的正则表达式功能.
需要明确的是:只要有足够的研究和/或引用资料来支持,任何主流引擎都无法做到这一点的答案是可以接受的.的回答说,它是可能的将是国家要容易得多,因为它需要一个例子.
关于非参与捕获组是什么的一些信息:
http://blog.stevenlevithan.com/archives/npcg-javascript-这篇文章最初向我介绍了这个想法.
https://www.regular-expressions.info/backref2.html - 本页的第一部分给出了简要说明.
在ECMAScript/Javascript正则表达式中,对NPCG的反向引用始终匹配(进行零长度匹配).在几乎所有其他正则表达式的味道,他们无法匹配任何东西.
写一个表达式来匹配像
a,aba,ababba,ababbabbba等字符串。 连续的数量b在每个 之后逐一增加a。
我正在学习正则表达式并在这个正则表达式测验中挣扎了好几天,但仍然无法完全正确。
根据描述,正则表达式应该匹配并失败以下情况:
aabaababbaababbabbbaababbabbbabbbbaaaabbaaaabbabababaababbba^a((b(?2)?)a)?(?1)*$
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用递归,但我不知道如何b在a满足每个递归后只添加一个。所以,我的解决方案也通过abba和ababbba等。
有任何想法吗?我错过了什么?
pcre ×10
regex ×9
php ×3
backtracking ×1
c++ ×1
java ×1
lookbehind ×1
perl ×1
posix-ere ×1
preg-replace ×1
r ×1
regex-group ×1