显然,您可以使用EDOCX1(管道?)代表OR,但有没有办法代表AND?
具体地说,我想匹配包含所有特定短语但没有特定顺序的文本段落。
- 你的意思是你想在一篇文章中找到短语,其中每一个这样的短语都是给定短语中单词的有效排列?
- 我把这个放在这里是因为三四个答案忽略它。lookahead不匹配每个子句的相同长度,除非它们以$结尾。一个前瞻可以匹配四个字符,另一个可以匹配6个字符。例如,(?= a*)(?)=aab)将匹配aabaaaba
- 尝试只使用"空格"字符作为"和"运算符。
- 1。I'd like to match paragraphs of text。2。包含无序文本。第一个问题可以解释。第二种方法有两种。方式一:(?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2},方式二:(?=.*\bphrase1\b)(?=.*\bphrase2\b),其中,在这种情况下,在段落定义正式化之前,段落的匹配是不确定的。
使用非消耗性正则表达式。
典型的(即Perl/Java)符号是:
(?=expr)号
这意味着"match expr",但之后继续在原始匹配点进行匹配。
您可以随心所欲地执行这些操作,这将是一个"and."示例:
(?=match this expression)(?=match this too)(?=oh, and this)
如果需要在非消费表达式中保存一些数据,甚至可以在其中添加捕获组。
- 你只是把它们排成一行,它们之间没有分隔符吗?即?=苹果)?=橙色)?=梨)
- 分隔符(或任何字符)将指示这些字符必须存在于下一个非消耗组之前。
- 试一试……我不认为这正是他的意思。
- perl-e"q一些东西=~/(?=一些)?=材料)?=事物)?打印"是":打印"否"打印"否"。
- 感谢您的好评;我已经更新了答案,以包括示例。
- 应该提到的是,这个特殊的例子被称为积极的先行断言。它除了"和"之外还有其他用途。请注意,文本不会被使用。
- 使用(?)=)像这样会产生一个永远不会成功的正则表达式。但它是与类似的连词。手术是错误的,他认为可以解决他的问题。
- perl-e"q一些东西=~/(?=一些)=东西)?=事物)?打印"是":打印"否"
- 您能在您的答案中添加一些Perl代码中的简单示例吗?
- 值得一提的是,japavascript不支持lookahead。
- @Nietzche-jou不正确,例如,在javascript中,以下regex匹配至少包含一个小写、大写和数字字符的字符串:/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])/,关键是在字符类前面加上.*前缀,因为lookaheads不移动位置,否则它将尝试匹配第一个字符(即是不可能的)。
- @Jageen自2019年起不正确,见上述评论。
- 菲尔拉同意
您需要像其他一些响应者所说的那样使用lookahead,但是lookahead必须考虑到目标词和当前匹配位置之间的其他字符。例如:
1
| (?=.*word1)(?=.*word2)(?=.*word3) |
第一个lookahead中的.*允许它匹配在到达"word1"之前所需的许多字符。然后重置匹配位置,第二个先行查找查找"word2"。重新设置,最后一部分与"word3"匹配;因为这是您要检查的最后一个单词,所以不必预先查看,但不会造成伤害。
为了匹配整个段落,需要在两端锚定regex,并添加一个最后的.*来使用剩余的字符。使用Perl样式的表示法,可以是:
1
| /^(?=.*word1)(?=.*word2)(?=.*word3).*$/m |
"m"修饰符用于多行模式;它允许^和$在段落边界处匹配(regex中的"行边界")。在这种情况下,必须不要使用"s"修饰符,它允许点元字符与换行符以及所有其他字符匹配。
最后,您要确保匹配的是整个单词,而不仅仅是长单词的片段,因此需要添加单词边界:
1
| /^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m |
- 完全正确-还有一个关于这个的教程!ocpsoft.org/tutorials/regular-expressions/and-in-regex
- 多谢。*这很重要
- +1对于清晰简洁的答案,显示了lookaheads的最佳用法之一(与hack等计算密码匹配百分比的用法不同)。:)
- 与qregexp合作!
- 在mysql的regexp()中是否支持此功能?
- @利亚姆:MySQL使用了posix-ere风格,所以不是,它实际上牺牲了特性而有利于性能,这在我看来是合理的。这里有更多信息。
- 如果在javascript的regex引擎中有与.不匹配的新行,并且不能用修饰符进行替换,则用javascript中的[\s\S]*替换.*
看看这个例子:
我们有两个regexps a和b,我们希望两者都匹配,所以在伪代码中,它看起来如下:
它可以不使用和运算符编写,如下所示:
1
| pattern ="/NOT (NOT A OR NOT B)/" |
在PCRE:
1 2 3
| "/^(^A|^B)/"
regexp_match(pattern,data) |
- 就形式逻辑而言,这是真的,但在这里绝对没有帮助。在正则表达式中,不可能比和更难表达。
- 聪明点。可以使用not和or组合
- 很好,正是我要找的!谢谢!
- 这在实践中有效还是无效?
- @马文·德普,这对我来说很有用,而另一个建议则不是。它似乎依赖于实现。
- 在regex语法中,^不是指"字符串的开始"吗?
- 一般来说,在regex中,^仅在字符类的开头是否定的。除非cmake做了一些非常奇怪的事情(以至于把他们的模式匹配语言称为"regex"可能被认为是误导或不正确的),否则我猜想它对你有效的事实是一个孤立的意外。
- 非常感谢,我觉得自己像个上帝。)
你可以用正则表达式来实现这一点,但可能你还需要一些其他的。例如,使用几个regexp并在if子句中组合它们。
您可以使用标准regexp枚举所有可能的排列,如下所示(以任意顺序匹配a、b和c):
1
| (abc)|(bca)|(acb)|(bac)|(cab)|(cba) |
但是,如果您有多个条件,这将导致非常长的、可能效率很低的regexp。
如果您使用的是一些扩展版本,如Perl或Java,它们有更好的方法来实现这一点。其他的答案也建议使用积极的前瞻性操作。
- 我不认为你的方法比3个具有灾难性回溯的lookaheads效率更低。当然,它的编写时间更长,但请注意,您可以轻松地自动生成模式。请注意,使用a(bc|cb)|b(ac|ca)|c(ab|ba)可以更快地改进它以使其失败。最重要的是,你可以用它来搭配所有的雷吉士口味。
and运算符在regexp语法中是隐式的。
或运算符必须用管道指定。
以下regexp:
表示字母a和字母b。
它还与以下组一起工作:
指EDOCX1组〔9〕和EDOCX1组〔10〕。
将(隐式)和替换为或需要以下行:
1 2
| var re = /a|b/;
var re = /(co)|(de)/; |
- 不幸的是,这不是OP要求的。这发现了任何按顺序排列的东西,而他们想要任何按顺序排列的东西。请访问stackoverflow.com/users/20938/alan-moore,下面的答案是正确的。
- @Jessii感谢你的观点,你是对的,我误解了Hugoware的问题,我特别关注他的第一句话。正如阿兰摩尔所写,正确的答案是正确使用先行运算符。不管怎样,我认为有人可能会发现我的澄清很有用,因为我已经被否决了,所以我不会把所有的东西都扔掉。当做。
在您的情况下,是否不可能对几个匹配结果执行和操作?伪码
1
| regexp_match(pattern1, data) && regexp_match(pattern2, data) && ... |
- 在这种情况下,我有一些代码是规则的数据表,其中有一个regex模式匹配字符串来测试规则的有效性。在我的案例中,移动到多个测试并不是我能做的,而且通常在其他人的案例中也是这样!
为什么不用锥子?有了awk regex和,或者说很简单
1
| awk '/WORD1/ && /WORD2/ && /WORD3/' myfile |
如果使用Perl正则表达式,则可以使用正的lookahead:
例如
1
| (?=[1-9][0-9]{2})[0-9]*[05]\b |
将是大于100且可被5整除的数字
您可以将输出通过管道传输到另一个regex。使用grep,您可以这样做:
grep A | grep B
除了接受的答案
我将为你们提供一些实际的例子,让你们中的一些人更清楚地了解事情。例如,假设我们有这三行文本:
1 2 3
| [12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x] |
在这里看到演示演示
我们要做的是选择+符号,但前提是它在两个带空格的数字之后,如果它在四个数字之前。这些是唯一的限制。我们将使用这个正则表达式来实现它:
1
| '~(?<=\d{2} )\+(?=\d{4})~g' |
注意,如果分离表达式,它将给出不同的结果。
或者您可能想在标记之间选择一些文本…但不是标签!然后你可以使用:
1 2
| '~(?<=<p>
).*?(?=<\/p>)~g' |
对于本文:
1 2 3 4 5
| <p>
Hello !
</p> <p>
I wont select tags! Only text with in
</p> |
在这里看到演示演示
在正则表达式的结构中,顺序总是隐含的。要实现您想要的,您必须针对不同的表达式多次匹配输入字符串。
对于单个regexp,您想要做的是不可能的。
- 从技术上讲,这不是不可能的,但不值得实施。我不知道为什么有人投了反对票…
- 可能是因为它不仅可能,而且很简单,假设您的regex风格支持lookaheads。这是一个很好的选择;今天的大多数主要编程语言都支持它们。
在正则表达式之外使用。在PHP中,lookahead操作符似乎不适合我,而是使用了这个
1 2 3 4
| if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
return true;
else
return false; |
如果密码长度大于或等于3个字符,并且密码中没有空格,则上述regex将匹配。