我在一个只允许使用Regex进行字符串操作的环境中工作,我需要从开始使用一个字符串,直到该字符串中出现某个关键字。但有时候这个关键字可能根本不会显示 - 正则表达式需要考虑到这一点,这意味着关键字外观是可选的,如果它没有出现,我想要将完整的字符串用于结尾。
关键字 dontconsumeafterthis
关键字的示例:
这是一个包含关键字dontconsumeafterthis这一部分的字符串 不应该消费
必需的输出:
这是一个包含关键字
的字符串
没有关键字的示例:
这是另一个没有关键字等的字符串pp。
必需的输出:
这是另一个没有关键字等的字符串pp。
答案 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