正则表达式:在一个单词之前消费任何东西(可能不会出现)

时间:2012-12-13 10:05:25

标签: regex

我在一个只允许使用Regex进行字符串操作的环境中工作,我需要从开始使用一个字符串,直到该字符串中出现某个关键字。但有时候这个关键字可能根本不会显示 - 正则表达式需要考虑到这一点,这意味着关键字外观是可选的,如果它没有出现,我想要将完整的字符串用于结尾。

关键字 dontconsumeafterthis

关键字的示例:

  

这是一个包含关键字dontconsumeafterthis这一部分的字符串   不应该消费

必需的输出:

  

这是一个包含关键字

的字符串

没有关键字的示例:

  

这是另一个没有关键字等的字符串pp。

必需的输出:

  

这是另一个没有关键字等的字符串pp。

3 个答案:

答案 0 :(得分:2)

以下正则表达式应该解决它(适用于我Expresso):

(.*?)(?=dontconsumeafterthis)|(.*)

说明:有两个选项,如果第一个不匹配,则最后一个选择整个字符串,但是第一个匹配只有当它达到dontconsumeafterthis时才会匹配,然后使用{{1 }}}运算符 - 另请注意?=(延迟评估),它会考虑多次出现*?

答案 1 :(得分:1)

/.*?(dontconsumeafterthis.*)/g的正则表达式适合您。

javascript中的解决方案看起来像这样:

var stringStart = "this is a string continaing the keyword dontconsumeafterthis this part should not be consumed";
var stringEnd = stringStart.replace(/.*?(dontconsumeafterthis.*)/g, "$1");
console.log(stringEnd);

它输出:

dontconsumeafterthis this part should not be consumed

<强>通知

正如Johny Skovdal在您的OP的评论中写道,为什么你需要用正则表达式做这个?您是否可以进行简单的字符串搜索,如果找到匹配则可以使用子字符串?

Javascript解决方案:

var stringStart = "this is a string continaing the keyword dontconsumeafterthis this part should not be consumed";
var stringFind = stringStart.indexOf("dontconsumeafterthis");
var stringEnd = (stringFind > -1 ? stringStart.substr(stringFind) : "");
console.log(stringEnd);
​

(与之前相同的输出)

答案 2 :(得分:0)

取决于语言/环境,但一般的想法是匹配关键字及其后的所有内容并将其替换为空,如果关键字不匹配,则不会替换任何内容,即:s/keyword.*//

$ cat file
this is a string continaing the keyword dontconsumeafterthis this part should not be consumed

this is another string without the keyword whatever etc. pp.6    

$ sed 's/dontconsumeafterthis.*//' file
this is a string continaing the keyword 

this is another string without the keyword whatever etc. pp.6