正则表达式,用于捕获星号之间的内容(单词除外)

时间:2019-06-08 06:40:31

标签: regex grep pcre regex-lookarounds regex-group

如果只能使用正则表达式,如何在此字符串中提取除“ NOT”之外的星号之间的文本?

* apple *  * orange tasty *  * banana *  * grape NOT *

预期结果:

apple

orange tasty

banana

5 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式: \*(\s*(?!NOT)\w+)+\s*\*

See explanation on regex101...

enter image description here

Here you can visualize your regular expression...

答案 1 :(得分:1)

您可能会使用“跳过失败”和\K来忘记当前匹配的内容:

\*[^*]* NOT [^*]*\*(*SKIP)(*FAIL)|\*\s*\K\w+(?: \w+)*(?= \*)

说明

  • \*[^*]* NOT [^*]*\*使用否定的字符类在星号和空格之间不匹配
  • (*SKIP)(*FAIL)跳过匹配项
  • |
  • \*\s*\K匹配星号,0 +个空格字符并忘记匹配的内容
  • \w+(?: \w+)*匹配1个以上的字符字符和一个重复的模式以匹配一个空格和1个以上的字符字符
  • (?= \*)正向前进,断言右边是一个空格和一个星号

Regex demo | grep demo

例如:

echo "* apple * * orange tasty * * banana * * grape NOT *" | grep -Po "\*[^*]* NOT [^*]*\*(*SKIP)(*FAIL)|\*\s*\K\w+(?: \w+)*(?= \*)"

结果

apple
orange tasty
banana

答案 2 :(得分:1)

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

使用GNU awk进行多字符RS和RT:

$(document).ready(function(){

        jQuery("#zip_1").submit(function(e){
            e.preventDefault();
            var gclidparm = getCookie('gclid');
            var urlparm = document.location.search ;
            $form = $(this); //wrap this in jQuery

            var formaction= $form.attr('action');               
            var requesturi = "https//mydomain.com" + formaction + 
                              urlparm + '&gclid='+gclidparm;
            alert ('req: '+requesturi);
            submitPage(requesturi);

function submitPage(parm1) {
           $(this).attr('action', parm1);
            jQuery(this).submit();

    }
 });
});

在每个UNIX机器上的任何外壳中都有任何awk:

$ awk -v RS='[*][^*]+[*]' 'RT !~ /NOT/{print RT}' file
* apple *
* orange tasty *
* banana *

以上方法通过使用几个简单的正则表达式而不是一个复杂的正则表达式来解决此问题。删除输出的每一端的$ awk '{ while ( match($0,/[*][^*]+[*]/) ) {str=substr($0,RSTART,RLENGTH); if (str !~ /NOT/) print str; $0=substr($0,RSTART+RLENGTH)} }' file * apple * * orange tasty * * banana * 很简单,但是我觉得OP会想要使用一些复杂的单个正则表达式。

答案 3 :(得分:1)

没有阅读所有答案,但是Mr. Morton的答案很有见地。

这个问题也很有趣,可以采用多种处理方式,我们将从一个表达式开始,该表达式使用单词边界收集NOT个单词,并根据所需的输出进行更改。最后,我们从字符串的开头到结尾滑动,可能会剩下多少,特别是如果我们要替换的话,但是最后一部分是不必要的:

(?:(\bNOT\b).)*|([\w\s]+?)|(.*?)

在这里,我们有两个不需要的组:

(?:(\bNOT\b).)*

(.*?)

,我们所需的数据在第二个捕获组中:

([\w\s]+?)

如果我们想要的字符比在[\w\s]类中列出的字符更多,可以简单地进行修改。

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。

RegEx电路

jex.im可视化正则表达式:

enter image description here

Demo

答案 4 :(得分:0)

您还可以使用它来提取另一组中的其他数据:

\*\s?(?:([a-zA-Z0-9 ]+?NOT))\s?\*|\*\s?([a-zA-Z0-9 ]+?)\s?\*

这在其他正则表达式引擎中也适用。 检出here
视觉Embeded

<iframe frameborder="0" width="746" height="562" src="https://jex.im/regulex/#!embed=true&flags=&re=%5C*%5Cs%3F(%3F%3A(%5Ba-zA-Z0-9%20%5D%2B%3FNOT))%5Cs%3F%5C*%7C%5C*%5Cs%3F(%5Ba-zA-Z0-9%20%5D%2B%3F)%5Cs%3F%5C*"></iframe>