C# 为啥我的 RegEx 不匹配?这个真的很简单

     2023-04-13     236

关键词:

【中文标题】C# 为啥我的 RegEx 不匹配?这个真的很简单【英文标题】:C# Why isn't my RegEx matching? This one is really simpleC# 为什么我的 RegEx 不匹配?这个真的很简单 【发布时间】:2021-09-03 10:25:41 【问题描述】:

我已经尝试了几个版本的多少个“\”来匹配 ()。模式需要一加一才能在字符串中得到它。

--fixme.h--

#
_TARGET_VERSION = $(_TARGET_VERSION_GREEN)

#

--Program.cs--

static void Main(string[] args)

    var expr = "(_TARGET_VERSION = \\$\\(_TARGET_VERSION_GREEN\\))";
    var repl = "!if 0\n$1\n!endif";

    var content = File.ReadAllText("fixme.h");
    var searchOptions = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline;
    var matched = Regex.Match(content, expr, searchOptions);
    if (matched.Success)
    
        var newContent = Regex.Replace(content, expr, repl, searchOptions);
        File.WriteAllText("fixed.h", newContent);
    

【问题讨论】:

这不是笔误,也不是非repro,问题是代码的匹配部分不能改,选项不能去掉。必须了解正则表达式选项的工作原理以及它们如何影响模式,这样才能解决问题。 【参考方案1】:

问题在于searchOptions,因为RegexOptions.IgnorePatternWhitespace 在模式格式中生成空格,编译正则表达式对象时,所有空格字符都会从模式中删除。 RegexOptions.Multiline 是多余的,这里可以去掉。

既然你说你不能对代码做太多改动,也不能删除searchOptions,你需要在模式开始处使用(?-x)内联修饰符去激活RegexOptions.IgnorePatternWhitespace选项效果。

这是工作代码:

var expr = "(?-x)_TARGET_VERSION = \\$\\(_TARGET_VERSION_GREEN\\)";
var expr = @"(?-x)_TARGET_VERSION = \$\(_TARGET_VERSION_GREEN\)";

或者,您可以转义所有文字空白字符

var expr = "_TARGET_VERSION\\ =\\ \\$\\(_TARGET_VERSION_GREEN\\)";
var expr = @"_TARGET_VERSION\ =\ \$\(_TARGET_VERSION_GREEN\)";

请注意,我从正则表达式模式中删除了外部捕获括号,并在替换模式中删除了 $1$&(一个完整的匹配反向引用)。

见C# demo online:

var expr = "(?-x)_TARGET_VERSION = \\$\\(_TARGET_VERSION_GREEN\\)";
var repl = "!if 0\n$&\n!endif";
var content = @"#
_TARGET_VERSION = $(_TARGET_VERSION_GREEN)

#";
var searchOptions = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline;
var matched = Regex.Match(content, expr, searchOptions);
if (matched.Success)

    var newContent = Regex.Replace(content, expr, repl, searchOptions);
    Console.WriteLine(newContent);

输出:


#
!if 0
_TARGET_VERSION = $(_TARGET_VERSION_GREEN)
!endif

#

【讨论】:

谢谢,但是这将被传递到更大的系统中,因此必须保留现有的搜索选项。如果空间是精确的,多行是多余的,那为什么会被破坏? @B.McKee 您可以在模式本身中覆盖这些选项。我在第一段中解释了为什么会出现问题:“问题在于searchOptions,因为RegexOptions.IgnorePatternWhitespace 在模式格式中生成空格,编译正则表达式对象时,所有空格字符都从模式中删除"

当 regex101 匹配时,RegEx C# 不匹配

】当regex101匹配时,RegExC#不匹配【英文标题】:RegExC#doesntMatchwhenregex101does【发布时间】:2018-08-1220:43:50【问题描述】:这是我的模式:-8\\s+((?:[0-9]2\\/[0-9]2\\/[0-9]2)\\s+(?:[0-9]2:[0-9]2:[0-9]2))\\s+(?:LINE)\\s+=\\s+([0-9]0,9)\\s+(?:STN)\\s+=\\s+( 查看详情

为啥这个正则表达式模式不匹配? [复制]

】为啥这个正则表达式模式不匹配?[复制]【英文标题】:Whydoesthisregexpatternnotmatch?[duplicate]为什么这个正则表达式模式不匹配?[复制]【发布时间】:2018-06-0218:24:23【问题描述】:Regex101链接:https://regex101.com/r/MsZy0A/2我有以下正... 查看详情

C# Regex.Replace 匹配相同数量的字符

】C#Regex.Replace匹配相同数量的字符【英文标题】:C#Regex.Replacematchbythesameamountofcharacters【发布时间】:2019-04-1818:05:08【问题描述】:我想知道如何将未知数量的等号(不少于2...)的正则表达式匹配替换为相同数量的下划线到目前... 查看详情

C# System.RegEx 在不应该匹配 LF 时匹配

】C#System.RegEx在不应该匹配LF时匹配【英文标题】:C#System.RegExmatchesLFwhenitshouldnot【发布时间】:2021-11-0601:40:42【问题描述】:以下返回真Regex.IsMatch("FooBar\\n","^([A-Z]([a-z][A-Z]?)+)$");也是这样Regex.IsMatch("FooBar\\n","^[A-Z]([a-z][A-Z]?)+$");RegE 查看详情

为啥我的简单不匹配查询不起作用?

】为啥我的简单不匹配查询不起作用?【英文标题】:Whyisn\'tmysimpleunmatchedquerynotworking?为什么我的简单不匹配查询不起作用?【发布时间】:2015-08-2412:22:37【问题描述】:SELECT[DenialQuery].BlPerFct_RcvGrpBlPerId,ATBDetailDaily.ClaimNo,ATBDetail... 查看详情

JDBC 和 MySQL 真的很慢,不知道为啥

】JDBC和MySQL真的很慢,不知道为啥【英文标题】:JDBCwithMySQLreallyslow,don\'tknowwhyJDBC和MySQL真的很慢,不知道为什么【发布时间】:2010-11-0623:13:43【问题描述】:我的Java代码和MySQL数据库之间的连接速度非常慢。我不知道瓶颈在哪... 查看详情

如何在 C# 中与 Regex Class 匹配我部分知道的字符串?

】如何在C#中与RegexClass匹配我部分知道的字符串?【英文标题】:HowmatchinC#withRegexClassthestringwhichIpartiallyknow?【发布时间】:2020-07-0207:55:57【问题描述】:我目前正在尝试使用Regex类来匹配我部分知道的字符串中的值。我确定这个... 查看详情

C# - 正则表达式 - 替换不匹配的字符

...19:48:10【问题描述】:[有类似的问题,但没有一个能满足我的需求]我允许用户输入匹配这个正则表达式的文本:stringvalidChars=@"^[A-Za-zÀ-ÖØ-öø-ÿ0-9\\s\\.\\-\\&\\,\\\'\\(\\)_\\/\\""\\!\\:\\% 查看详情

为啥这个重复的内部组在正则表达式中不匹配? [复制]

】为啥这个重复的内部组在正则表达式中不匹配?[复制]【英文标题】:Whyisn\'tthisrepeatedinnergroupmatchinginregex?[duplicate]为什么这个重复的内部组在正则表达式中不匹配?[复制]【发布时间】:2019-12-0916:35:51【问题描述】:我正在尝... 查看详情

为啥我的 reg ex 不捕获第二行和后续行?

】为啥我的regex不捕获第二行和后续行?【英文标题】:Whydoesmyregexnotcapture2ndandsubsequentlines?为什么我的regex不捕获第二行和后续行?【发布时间】:2019-04-0114:55:10【问题描述】:更新我尝试将RegexOptions.Singleline添加到我的regex选项... 查看详情

为啥我的简单 ajax 帖子没有调用 c# web 方法?

】为啥我的简单ajax帖子没有调用c#web方法?【英文标题】:Whyismysimpleajaxpostnotcallingthec#webmethod?为什么我的简单ajax帖子没有调用c#web方法?【发布时间】:2019-06-1021:43:39【问题描述】:我有一个非常简单的AJAXPost,它不调用C#Web方... 查看详情

c# Regex 匹配所有斯里兰卡电话号码

】c#Regex匹配所有斯里兰卡电话号码【英文标题】:c#RegextomatchallSriLankanphonenumbers【发布时间】:2019-01-0209:49:29【问题描述】:我在google上没有找到关于斯里兰卡电话号码的正则表达式;格式为:775645645(9位)0775645645(10位)+9477... 查看详情

C# 正则表达式将不匹配

...所有日志文件并将其压缩的代码。我看不到让RegEx模式在我的代码中工作。下面是我用来测试的沙盒控制台应用程序:publicstaticvoidMain(string[]args)vartargetDate=DateTime.Now.AddMonths(-1);varpatter 查看详情

为啥这个简单的“INSERT INTO”查询不起作用

】为啥这个简单的“INSERTINTO”查询不起作用【英文标题】:Whywontthissimpy"INSERTINTO"querywork为什么这个简单的“INSERTINTO”查询不起作用【发布时间】:2014-03-3120:11:13【问题描述】:我正在为您通过表单注册的学校项目创建... 查看详情

为啥这个非常简单的构造函数会导致段错误?

】为啥这个非常简单的构造函数会导致段错误?【英文标题】:Whyisthisverysimpleconstructorcausingasegfault?为什么这个非常简单的构造函数会导致段错误?【发布时间】:2013-09-2216:53:34【问题描述】:这很尴尬,但我对我的C++有点生疏... 查看详情

在 C# 中仅保留 Regex.Split 的匹配模式

】在C#中仅保留Regex.Split的匹配模式【英文标题】:KeeponlymatchedpatternsofRegex.SplitinC#【发布时间】:2020-05-2910:06:26【问题描述】:我只想保留Regex.Split()的匹配模式并丢弃其他文本。示例假设我只想打印文本中的大写单词。Console.Writ... 查看详情

C# Regex 正确匹配 JSON api 响应

】C#Regex正确匹配JSONapi响应【英文标题】:C#RegexmatchingJSONapiresponsecorrectly【发布时间】:2016-07-1314:23:18【问题描述】:我正在尝试以正确的方式匹配BlockchainJSONApi响应,但似乎我做不到。区块链API响应如下所示:"addresses":["balance":... 查看详情

为啥这个 CoreGraphics 绘制代码很慢?

】为啥这个CoreGraphics绘制代码很慢?【英文标题】:WhyisthisCoreGraphicsdrawingcodeslow?为什么这个CoreGraphics绘制代码很慢?【发布时间】:2020-11-0110:30:21【问题描述】:我根据我的其他一些开源程序编写了这个绘图代码。它根据用户... 查看详情