C# 替换字符串的正则表达式

C# 替换字符串的正则表达式,c#,asp.net,regex,C#,Asp.net,Regex,我正在研究从其他人那里继承的一些代码,并试图理解C#中的一些正则表达式代码: 上面的正则表达式在做什么?这与执行搜索的用户的输入有关。它使用第二个参数中提供的模式将查询字符串替换为第三个参数的值。但那个正则表达式是什么?对我来说,这毫无意义。谢谢。这个@使得有必要用第二个“来逃避所有的”,所以“”。如果没有它来逃避 你会使用 \代码>,但是我认为最好在ReGEXES中始终使用 @ /代码>,因为 \/COM>经常使用,而且总是需要将它转出到 \\/>代码中,这是枯燥的和不可读的。 让我们看看正则

我正在研究从其他人那里继承的一些代码,并试图理解C#中的一些正则表达式代码:


上面的正则表达式在做什么?这与执行搜索的用户的输入有关。它使用第二个参数中提供的模式将
查询
字符串替换为第三个参数的值。但那个正则表达式是什么?对我来说,这毫无意义。谢谢。

这个
@
使得有必要用第二个
来逃避所有的
,所以
”。如果没有它来逃避<代码> 你会使用<代码> \代码>,但是我认为最好在ReGEXES中始终使用<代码> @ /代码>,因为<代码> \/COM>经常使用,而且总是需要将它转出到<代码> \\/>代码中,这是枯燥的和不可读的。 让我们看看正则表达式到底是什么:

Console.WriteLine(@"""[^""~]+""([^~]|$)");

现在我们来看看“真正的”正则表达式

它查找一个
后跟一个或多个
非-”和一个
非-
后跟另一个
后跟一个
非-”或字符串的结尾
。请注意,匹配可以在字符串的开头之后开始,也可以在字符串的结尾之前结束(使用
非-

例如在

car"hello"help

据我所知,xanatos的答案是正确的。我试图理解正则表达式,所以它来了:

您可以测试我们的正则表达式并使用单个部分,以便在

1.)单个字符

"

第一个模式是文字字符。因为没有相对位置的陈述,它可以在任何地方发生

2.)字符类

[^”~]

下一个表达式是[]-括号。这是一个字符集。它定义了大量的字符,可能紧跟其后。它是单个字符的占位符…让我们看看里面允许哪些内容:

^"~

字符类的定义以一个特殊字符插入符号(^)开始。在开始的方括号后键入插入符号将否定字符类。所以它是“颠倒的”:后面所有与类表达式不匹配的内容都匹配并且是有效字符

在这种情况下,除了两个被排除的字符外,所有文字字符都是可能的:“或~

(三)特殊人物

+

下一个表达式是加号,它告诉引擎尝试一次或多次匹配前面的标记。 因此,定义的字符类应该重复一次或多次以匹配给定的表达式

4.)单个字符

"

为了匹配,表达式应该进一步包含一个撇号,这将是1.)中第一个撇号的对应撇号,因为(2.)中的字符类因此(3.)不允许撇号

(五)环顾四周

([^~]|$)

这里要检查的第一个结构是()括号。这被称为“环顾”。 这是一个特殊的群体。环视匹配一个位置。它不展开正则表达式匹配。 这意味着这部分不会试图在表达式中找到任何特定字符 而不是将它们本地化

本地化需求有两个条件,它们通过逻辑或管道符号连接:| 所以匹配表达式的下一个字符可以是 [^ ~]类中的一个字符,除该字符外的所有字符~ 或 $行的结尾(或字,如果在正则表达式引擎中未使用多行模式)

我会尝试将我的答案编辑成更好的格式,因为这是我的第一篇文章,我首先要检查一下它是如何工作的:)

更新: 要“检测”该行前面/末尾的星号/星星,您必须执行以下操作:

首先,它是一个特殊字符,因此必须用反斜杠将其转义:*

要定义位置,可以使用:

  • ^看看这一行的开头
  • $line结束
总的表述是:

^*在表达式前面,搜索表达式开头的* 正则表达式末尾的行$*要求在末尾使用*

。。。。在您的情况下,您可以在最后一个字符类中添加*以在最后检测*:

([^ ~]$$$*)

最后,要强制执行*,请删除其他条件:

($*)

附言:
(不知怎的,我的正则表达式被格式化引擎吞没了,所以我的更新错了…

有帮助吗?谢谢,xanatos。令人困惑的是,
并没有用反斜杠转义。接下来的问题是:如何在字符串的开头或结尾检测到
*
?@Alex您必须将其转义为
\*
…但“检测”的意思是什么?可选的
\*
\*?
,这样您就可以编写“*?”[^”“~++”([^]-])”(如果您希望*位于
”之外),然后使用标准字符串方法检查是否存在
*
。最后的
[^~]
已经会吃掉
*
谢谢,@xanatos.Detect是一个错误的词——知道模式存在并替换它。所以没有正则表达式模式可以检测最后一个
*
?是否建议使用
lastIndexOf()
方法,并以某种方式将两者合并为一个检查?@Alex是的,但“Detect”不是一个意义单一的词。你必须给出具体的例子,说明你想匹配什么,不想匹配什么,以及匹配后你想做什么。记住正则表达式可以有多种用途,这一点很重要。搜索你想替换的文本的正则表达式不同于你想用来获取s的正则表达式一些文本片段和两者都不同于只有文本具有特定“形状”时才会显示的正则表达式。谢谢,@EpicEmil。你检查了每个正则表达式片段并解释了它们
"[^"~]+"([^~]|$)
car"hello"help
    "[^"~]+"([^~]|$)