我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
当前回答
答案非常好,只是一个学术点:
计算机科学的理论意义上的常规表达是不可能这样做的,对他们来说,它应该看起来像这样:
^([^h].*$)|(h([^e].*$|$))|(he([^h].*$|$))|(heh([^e].*$|$))|(hehe.+$)
这只是一场完整的比赛,做下一场比赛会更可怕。
其他回答
不是雷格斯,但我发现使用带管的序列粘贴是合乎逻辑和有用的,以消除噪音。
例如,搜索一个 Apache 配置文件,没有所有评论 -
grep -v '\#' /opt/lampp/etc/httpd.conf # this gives all the non-comment lines
和
grep -v '\#' /opt/lampp/etc/httpd.conf | grep -i dir
序列格雷普的逻辑是(不是一个评论)和(比赛是)
它可能更可维持在您的代码中的两个规则,一个进行第一场比赛,然后如果它匹配运行第二个规则,以检查您想要阻止的其他案例,例如 ^.*(hede)。* 然后在您的代码中有适当的逻辑。
好吧,我承认这不是一个真正的答案发表的问题,它也可能使用一些更多的处理,而不是一个单一的 regex. 但对于开发人员谁来到这里寻找一个快速紧急修复的另一个案例,那么这个解决方案不应该被忽视。
如果你想匹配一个字符,否认类似于否认字符类的单词:
例如,一条线:
<?
$str="aaa bbb4 aaa bbb7";
?>
不要使用:
<?
preg_match('/aaa[^bbb]+?bbb7/s', $str, $matches);
?>
使用:
<?
preg_match('/aaa(?:(?!bbb).)+?bbb7/s', $str, $matches);
?>
警告“(?!bbb.)”不是 lookbehind 或 lookahead,它是 lookcurrent,例如:
"(?=abc)abcde", "(?!abc)abcde"
OP 没有指定或标记帖子,以显示背景(编程语言、编辑器、工具)中将使用 Regex。
对于我来说,有时我需要在使用 Textpad 编辑文件时做到这一点。
Textpad 支持一些 Regex,但不支持 lookahead 或 lookbehind,所以需要几步。
Search string:^(.)
Replace string:<@#-unique-#@>\1
Replace-all
Search string:<@#-unique-#@>.*hede.*\n
Replace string:<nothing>
Replace-all
此分類上一篇
此分類上一篇
Search string:<@#-unique-#@>
Replace string:<nothing>
Replace-all
现在你有原始文本,所有包含字符串的线条已被删除。
此分類上一篇
Search string:^(.)
Replace string:<@#-unique-#@>\1
Replace-all
对于包含字符串标签的所有行,请删除独特的“标签”:
Search string:<@#-unique-#@>(.*hede)
Replace string:\1
Replace-all
此分類上一篇
此时此刻,所有以独特的“标签”开始的线条,不包含线条标签,我现在只能用这些线条来做我的某事。
当我完成时,我将从所有行中删除独特的“标签”(替换行是空的):
Search string:<@#-unique-#@>
Replace string:<nothing>
Replace-all
更简单的解决方案是使用非运营商!
如果您的声明需要匹配“内容”而不匹配“排除”。
var contains = /abc/;
var excludes =/hede/;
if(string.match(contains) && !(string.match(excludes))){ //proceed...
我相信RegEx的设计师预测了非运营商的使用。