添加详细信息
我在网上找到了以下两种否认方式:
?!
[^\w]
但是我找不到他们用来描述操作的西班牙语和英语文档,我认为它太高级了,无法理解两者的含义以及如何正确使用它们以获得预期的结果。当前的答案解决了这个问题,但没有给出使用定义。
问题陈述
我想选择文本中所有不在引号中的单词。我知道如何反其道而行之。
例子:
Lorem ipsum "pain sit amet" , consectetur adipiscing elit, maecenas est felis "sit amet"。
使用以下正则表达式,您可以使用括号中的单词:
/"([\w\s]+)"/gim
结果
[
1 => 'dolor sit amet',
2 => 'sit amet'
]
我在寻找什么
[
1 => 'Lorem ipsum ',
2 => ', consectetur adipiscing elit, maecenas est felis ',
3 => '.',
]
另一个例子是,来自以下列表:
- 你好
- 你好
- 你好
- 你好*
- 你好
打印/选择不使用字母数字字符的那些(我知道如何采取与既定指示相反的方式)。取所有非字母数字字符,取所有没有“l”的单词,取所有不以字母“z”开头的单词,等等。
工作示例: http ://www.regextester.com/15
我希望对所有不以“a”开头的东西做这样的事情:
/!^a.*/
但显然它对我不起作用,我正在等待您的反馈。
澄清
我也想了解提出的解决方案,而不仅仅是解决问题的复制粘贴。
注意:我在此处引用的用于获取文本的正则表达式适用于 PHP 和 JavaScript(我用来解决问题的语言),我已经看到不同语言中的正则表达式存在小的变化但在这两者之间,它并不是什么实质性的东西。因此,我希望建议的解决方案在 2 之一中工作。
我将此答案添加为与正则表达式相关的信息。这是我在西班牙语中对 SO 的第一个回答,它不是翻译,所以如果它不正确,我可以删除或更正它。
关于您在问题中的评论:
这是两个不同的概念。一方面你有什么被认为是一个
lookaround
,另一方面是一个字符类。他们是这样工作的:环顾四周
Lookarounds可以理解为查看一个模式是否在另一个模式之前或之后的不同方式。例如,只要后面的单词不存在,表达式
hola(?!chau)
就会匹配该单词。hola
chau
即:
您的问题与“如何否认”有关,但我还想提一下,环顾四周分为:
hola(?=chau)
时才会匹配单词hellohola(?!chau)
并且只有在没有再见的情况下才会匹配单词hello(?<=chau)hola
时才会匹配单词hello(?<!chau)hola
时才会匹配单词hello值得一提的是,并非所有浏览器中的 Javascript 都支持lookbehinds(请参阅兼容性)。
您可以在以下位置找到有关环视的更多信息:
http ://www.regular-expressions.info/lookaround.html
字符类
另一方面,有字符类,在西班牙语中可以理解为一组字符(或字符类),并使用方括号
[
..]
。换句话说,如果我们有
[aeiou]
,则只会匹配没有重音标记的元音。同样,可以否定一个类,正如您
^
在开始时提到的使用 ... 所以[^aeiou]
在这种情况下,它将匹配一个不是无波浪元音的字符。以下是有关字符类的更多信息:
http ://www.regular-expressions.info/charclass.html
动词
现在,在给你一些背景信息之后。如果您想使用正则表达式来捕获/匹配所有不在引号中的单词,那么 PCRE(Perl 兼容正则表达式,由 PHP、R、Delphi 等支持)具有对您的情况非常有用的动词。
最著名的是
(*SKIP)
并且(*FAIL)
经常一起使用,并且通常以这种方式使用:实际例子
这些类型的模式通常被称为丢弃技术,它们总是使用相同形式的模式,由 分隔
OR
:因此,上面的表达式
".*?"(*SKIP)(*FAIL)|(\w+)
将丢弃在skip和fail()之前出现的所有匹配项".*?"
,并捕获最后一个模式(使用括号...括号用于捕获内容)。解释的正则表达式
".*?"(*SKIP)(*FAIL)|(\w+)
将是:因此,在上面的链接中,当该表达式应用于文本时:
捕获以下内容:
结论,在我看来,正则表达式非常棒,但前提是你知道如何使用它们。就我个人而言,没有它们我就活不下去,但就像所有东西一样……要打钉子,你需要一把锤子而不是螺丝刀。在正则表达式的情况下,它们非常适合模式匹配,但是如果您需要逻辑,那么这绝对不是要使用的工具。
在这些情况下,最好采取简单的方法(Regexp 是地狱)。所以如果你已经知道如何找到你不想找到的东西
所以最简单的方法是使用
preg_split
删除与该表达式匹配的所有内容在您作为示例的链中执行此操作时,它将返回三个块,它们是不包含在引号中的块
如果你想得到将被删除的内容,你首先
preg_match()
要做的是,然后你可以使用explode
no need对字符串进行正常拆分preg_split
。当然你可以使用
preg_split
,但这将是不必要的处理周期。对于另一种情况,它更容易一些
任何带有非字母数字字符的东西
只需使用像这个表达式这样的否定范围来标记所有非字母数字字符
已经使用此表达式,您可以获得执行 mathc 的输入
preg_grep
输出
一切不是以a开头的
用这个表达式:
^[^a]+
输出
如果您使用以下正则表达式:
或更确切地说,类似于以下代码:
您会得到以下输出:
在线查看演示。
如果您查看该函数的文档
preg_split
,您会发现该标志PREG_SPLIT_NO_EMPTY
会从输出中删除空字符串,并且该标志会PREG_SPLIT_DELIM_CAPTURE
返回结果中括号中的正则表达式部分。丢弃技术(也被RexEgg称为“最好的正则表达式技巧
”) - 在 JavaScript 中工作。
它非常简单,它包括
就这些!
这个“技巧”是基于它会匹配一个不想匹配的事实,但技巧来了:它不会被捕获!这种细微的差别会让我们知道它是否匹配我们的异常,或者它是否匹配我们希望它匹配的内容。
中的括号
(esto sí)
创建一个组,并且像任何组一样,当它们与文本一致时,它们会捕获它......这意味着它们是在或的结果中单独获得的。因此,只需检查是否在第 1 组中捕获了某些内容。RegExp.exec()
String.matchAll()
让我们以问题为例:选择除引号部分之外的所有文本。
代码: