显然,您可以使用|
(管道?)来表示OR
,但有没有办法表示AND
?
具体来说,我想匹配包含某个短语的所有文本的段落,但没有特定的顺序.
现代正则表达式引擎中有一些功能允许您匹配没有该功能时无法匹配的语言.例如,使用后引用的以下正则表达式匹配由重复自身的单词组成的所有字符串的语言:(.+)\1
.此语言不常规,不能与不使用反向引用的正则表达式匹配.
外观是否也会影响正则表达式可以匹配的语言?即是否有任何语言可以使用无法匹配的外观匹配?如果是这样,对于所有类型的环视(负面或正向前瞻或后观)或仅仅针对其中一些而言,这是真的吗?
在我的主目录中,我有一个drupal-6.14文件夹,其中包含Drupal平台.
从这个目录我使用以下命令:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Run Code Online (Sandbox Code Playgroud)
这个命令的作用是gzips文件夹drupal-6.14,不包括drupal-6.14/sites/ 除了sites/all和sites/default之外的所有子文件夹.
我的问题是关于正则表达式:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
该表达式可以排除我想要排除的所有文件夹,但我不太明白为什么.
使用正则表达式是一项常见任务
匹配所有字符串,但不包含子模式x的字符串除外.或者换句话说,否定子模式.
我(想)我明白解决这些问题的一般策略是使用否定的前瞻,但我从来没有理解到正面和负面的外观(前瞻/后退)是如何工作的.
多年来,我已经阅读了很多网站.PHP和Python正则表达式手册,其他页面,如http://www.regular-expressions.info/lookaround.html等,但我从来没有真正理解它们.
有人可以解释,这是如何工作的,也许可以提供一些类似的例子来做类似的事情?
- 更新一:
关于Andomar的回应:双重否定前瞻可以更简洁地表达为单一的积极前瞻性陈述:
即是:
'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
相当于:
'drupal-6.14/(?=sites(?:/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
???
- 更新二:
根据@andomar和@alan moore - 你不能互换双负前瞻以获得积极的前瞻.
是否可以在正则表达式中进行字符串否定?我需要匹配所有不包含字符串的字符串".."
.我知道你可以使用^[^\.]*$
匹配所有不包含的字符串,"."
但我需要匹配多个字符.我知道我可以简单地匹配一个包含的字符串".."
,然后否定匹配的返回值以获得相同的结果,但我只是想知道它是否可能.
我在C#程序中有以下正则表达式,并且难以理解它:
(?<=#)[^#]+(?=#)
Run Code Online (Sandbox Code Playgroud)
我会把它分解为我认为我理解的内容:
(?<=#) a group, matching a hash. what's `?<=`?
[^#]+ one or more non-hashes (used to achieve non-greediness)
(?=#) another group, matching a hash. what's the `?=`?
Run Code Online (Sandbox Code Playgroud)
所以这个问题我已经是?<=
和?<
组成部分.从阅读MSDN,?<name>
用于命名组,但在这种情况下,尖括号永远不会关闭.
我?=
在文档中找不到,搜索它真的很难,因为搜索引擎大多会忽略那些特殊的字符.
自从我开始写这个问题以来,我想我已经找到了每个问题的答案,但我认为无论如何我都会发帖,因为它可能对其他人有用,更多的澄清可能会有所帮助.
我试图使用带有javascript函数拆分的前瞻性的正则表达式.由于某种原因,即使在我调用匹配时找到匹配项,它也不会拆分字符串.我原本以为问题来自于我的正则表达式中使用前瞻.这是一个简化的例子:
不起作用:
"aaaaBaaaa".split("(?=B).");
Run Code Online (Sandbox Code Playgroud)
作品:
"aaaaBaaaa".match("(?=B).");
Run Code Online (Sandbox Code Playgroud)
问题似乎是在拆分示例中,传递的字符串未被解释为正则表达式.使用正斜杠而不是引号似乎可以解决问题.
"aaaaBaaaa".split(/(?=B)./);
Run Code Online (Sandbox Code Playgroud)
我用以下愚蠢的例子证实了我的理论:
"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");
Run Code Online (Sandbox Code Playgroud)
有没有其他人认为匹配函数假设你有一个正则表达式,而split函数没有?
我在Python中实现了一个基于生成器的扫描程序,它将字符串标记为表单的元组(标记类型,标记值):
for token in scan("a(b)"):
print token
Run Code Online (Sandbox Code Playgroud)
会打印
("literal", "a")
("l_paren", "(")
...
Run Code Online (Sandbox Code Playgroud)
下一个任务意味着解析令牌流,为此,我需要能够从当前的一个项目前面查看一个项目,而不必将指针向前移动.事实上,迭代器和生成器不能一次提供完整的项目序列,但是每个项目根据需要使得前瞻与列表相比有点棘手,因为除非__next__()
被调用,否则下一个项目是未知的.
什么可以直接实现基于生成器的前瞻看起来像?目前我正在使用一种解决方法,这意味着从生成器中生成一个列表:
token_list = [token for token in scan(string)]
Run Code Online (Sandbox Code Playgroud)
然后很容易通过以下方式实现前瞻:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
Run Code Online (Sandbox Code Playgroud)
当然这只是工作正常.但是考虑到这一点,我的第二个问题就出现了:首先是否真的需要制造scan()
发电机?
我无法理解如何计算LR(1)-items的前瞻.
让我们说我有这个语法:
S -> AB
A -> aAb | a
B -> d
Run Code Online (Sandbox Code Playgroud)
LR(1)-item是具有前瞻的LR(0)项.所以我们将为状态0得到以下LR(0)-item:
S -> .AB , {lookahead}
A -> .aAb, {lookahead}
A -> .a, {lookahead}
Run Code Online (Sandbox Code Playgroud)
州:1
A -> a.Ab, {lookahead}
A -> a. ,{lookahead}
A -> .aAb ,{lookahead}
A ->.a ,{lookahead}
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何计算前瞻吗?一般方法是什么?
先感谢您
如何匹配任何重复n
次数的角色?
例:
for input: abcdbcdcdd
for n=1: ..........
for n=2: .........
for n=3: .. .....
for n=4: . . ..
for n=5: no matches
Run Code Online (Sandbox Code Playgroud)
几个小时后,我最好的是这个表达
(\w)(?=(?:.*\1){n-1,}) //where n is variable
Run Code Online (Sandbox Code Playgroud)
它使用前瞻性.但是这个表达式的问题是:
for input: abcdbcdcdd
for n=1 ..........
for n=2 ... .. .
for n=3 .. .
for n=4 .
for n=5 no matches
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,当前瞻与一个角色匹配时,让我们看看for n=4
线条,d
前瞻断言是满意的,并且首先d
由正则表达式匹配.但剩下d
的并不匹配,因为他们没有d
比他们还多3个.
我希望我能清楚地说出这个问题.希望您的解决方案,提前感谢.
只是一个简单的正则表达式,我不知道如何写.
正则表达式必须确保字符串匹配所有3个单词.我看到如何使它匹配3 中的任何一个:
/advancedbrain|com_ixxocart|p\=completed/
Run Code Online (Sandbox Code Playgroud)
但我需要确保字符串中包含所有 3个单词.
这是单词
lookahead ×10
regex ×8
javascript ×2
lookaround ×2
lookbehind ×2
dfa ×1
generator ×1
lr-grammar ×1
negation ×1
parsing ×1
php ×1
python ×1
repeat ×1
split ×1