正则表达式排除“:”和空格(如果存在)

Posted

技术标签:

【中文标题】正则表达式排除“:”和空格(如果存在)【英文标题】:Regex exclude ":" and a whitespace if they exist 【发布时间】:2021-09-09 05:04:53 【问题描述】:

所以我在这里有一个正则表达式:

var text = new Regex(@"(?<=Paybacks).*", RegexOptions.IgnoreCase);

这会查找以 Paybacks 开头的行。现在它当前打印“:blah”。 上下文有时可以是“Paybacks”或“Paybacks:”或“Paybacks”,或者我不知道“Paybacks(带有数千个空格)。我怎样才能修改这个正则表达式就像......在“Paybacks”之后忽略冒号和一个可能存在也可能不存在的空格(或多个空格)。

我一直在 regex101 中使用它,这似乎有效,但有更好的方法吗?

(?<=Volatility(:\s)).*

【问题讨论】:

【参考方案1】:

在这些情况下,您最好使用带有捕获组的正则表达式:

var pattern = new Regex(@"Paybacks[\s:]*(.*)", RegexOptions.IgnoreCase);

然后,你可以使用

var output = Regex.Match(text, pattern)?.Groups[1].Value;

见.NET regex demo:

见C# demo:

var texts = new List<string>  "Paybacks: blah","Paybacks:blah","Paybacks blah";
var pattern = new Regex(@"Paybacks[\s:]*(.*)", RegexOptions.IgnoreCase);
texts.ForEach(text => Console.WriteLine(pattern.Match(text)?.Groups[1].Value));

打印 3 blahs.

【讨论】:

【参考方案2】:

您还可以在后视中匹配可选的冒号和空白字符,并开始匹配除 : 以外的任何非空白字符的第一个字符

(?<=Paybacks[:\s]*)[^\s:].*

模式匹配:

(?&lt;= 正面向后看,断言左边是 Paybacks 字面匹配 [:\s]* 可以选择匹配 : 或使用字符类的空白字符 ) 近距离观察 [^\s:].* 匹配除: 以外的单个非空白字符和该行的其余部分

Regex demo | C# demo

var regex = new Regex(@"(?<=Paybacks[:\s]*)[^\s:].*", RegexOptions.IgnoreCase);
string[] strings = "Paybacks: blah", "Paybacks blah", "Paybacks                  blah";

foreach (String s in strings)

    Console.WriteLine(regex.Match(s)?.Value);

输出

blah
blah
blah

如果顺序应该是一个可选的冒号和可选的空白字符,您可以使用:?\s*将冒号和空白字符的量词设为0或更多

(?<=Paybacks:?\s*)[^\s:].*

Regex demo

【讨论】:

以上是关于正则表达式排除“:”和空格(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章

更新正则表达式以排除除了空格之外的任何内容

正则表达式排除括号

正则表达式从组中删除空格

java的一个匹配多个邮箱的地址的正则表达式问题。

java用正则表达式判定特殊字符是不是,存在就替换的问题?

Hive 排除 SELECT 中某列