1

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

关键字是dontconsumeafterthis

带有关键字的示例:

这是一个包含关键字 dontconsumeafterthis 的字符串,这部分不应该被使用

所需输出:

这是一个包含关键字的字符串

没有关键字的例子:

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

所需输出:

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

4

3 回答 3

2

以下正则表达式应该可以解决它(在Expresso中对我有用):

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

说明:有 2 个选项,如果第一个不匹配,则最后一个取整个字符串,但第一个仅在命中时才匹配dontconsumeafterthis,然后使用?=运算符将​​其从捕获中排除 - 另外,请注意*?(惰性评估) ,它考虑了多次出现的dontconsumeafterthis情况)。

于 2012-12-13T13:37:56.237 回答
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);
​

(与之前相同的输出)

于 2012-12-13T10:09:46.197 回答
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  
于 2012-12-13T10:16:27.840 回答