正则表达式排除“:”和空格(如果存在)
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 blah
s.
【讨论】:
【参考方案2】:您还可以在后视中匹配可选的冒号和空白字符,并开始匹配除 :
以外的任何非空白字符的第一个字符
(?<=Paybacks[:\s]*)[^\s:].*
模式匹配:
(?<=
正面向后看,断言左边是
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
【讨论】:
以上是关于正则表达式排除“:”和空格(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章