Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式基于组的不同替换?_C#_.net_Regex_Vb.net - Fatal编程技术网

C# 正则表达式基于组的不同替换?

C# 正则表达式基于组的不同替换?,c#,.net,regex,vb.net,C#,.net,Regex,Vb.net,所以我对正则表达式的理解相对不多,并且做了一些练习 我在玩一个简单的狗“Deobfactor”,它只查找[dot]或(dot)或[at]或(at)。不区分大小写,在匹配之前或之后带有或不带任何数量的空格 这是针对通常的:someemail[AT]域(dot)com类型的东西。我显然想把它变成someemail@domain.com 我提出的正则表达式可以很好地进行匹配,但现在我想根据匹配情况替换为或@ i、 e。 我希望匹配“点”组的组替换为文字,匹配“at”组的组替换为文字@ 我知道我可以写两

所以我对正则表达式的理解相对不多,并且做了一些练习

我在玩一个简单的狗“Deobfactor”,它只查找
[dot]
(dot)
[at]
(at)
。不区分大小写,在匹配之前或之后带有或不带任何数量的空格

这是针对通常的:
someemail[AT]域(dot)com
类型的东西。我显然想把它变成
someemail@domain.com

我提出的正则表达式可以很好地进行匹配,但现在我想根据匹配情况替换为
@

i、 e。 我希望匹配“点”组的组替换为文字
,匹配“at”组的组替换为文字
@

我知道我可以写两个不同(几乎完全相同)的正则表达式,然后在两个正则表达式中运行,但为了教育起见,我想看看我是否可以在一个正则表达式中完成所有操作

这是我想到的正则表达式(可能不是最小的,我也有兴趣看到):

+(\[\\()(点)(\)\])++(\[\\()(at)(\)\])+

注意:在每个
+
之前都有一个空白,用于匹配空格

我要找的是我将如何正确地进行替换

更新:很抱歉,忘了添加我使用的语言。在本例中,我使用的剪贴板实用程序可以在其输入上运行正则表达式(无论复制到剪贴板的是什么),它使用的引擎是C#/VB.NET。这个小项目的最终目标是能够复制一个“模糊”的电子邮件地址或URL,并在其上运行正则表达式,以便将其设置在剪贴板上的“未模糊”状态


也就是说,我确实倾向于在许多不同的语言上使用正则表达式,所以在语言之间转换它们通常不是问题。

如果您使用的是Java,请尝试类中的方法

最后,您需要使用空格对其进行规范化:
-纯Java-
String after=before.trim().replaceAll(“\\s+”,”)
-纯Java-
String after=before.replaceAll(“\\s{2,},”).trim()
--
stringafter=StringUtils.normalizeSpace(stringstr)

-.NET正则表达式不支持条件替换模式。

.NET正则表达式不支持条件替换模式。

为了教育起见,我想看看我是否能在一个正则表达式中完成所有的工作

还有其他一些正则表达式引擎允许在单个正则表达式替换操作中使用条件替换逻辑

有3个引擎支持这种类型的替换:JGsoft V2、Boost和PCRE2

要使条件语句在Boost中工作,需要将
regex\u常量::format\u all
传递到
regex\u replace
。要使它们在PCRE2中工作,您需要将
PCRE2\u SUBSTITUTE\u EXTENDED
传递到
PCRE2\u SUBSTITUTE

在PCRE2中:

${1:+matched:unmatched}
其中1是一个介于1和99之间的数字,引用一个编号的捕获组。如果您的正则表达式包含命名捕获组,那么您可以在条件中通过名称引用它们:
${name:+matched:unmatched}

如果要在匹配的部分中使用文字冒号,则需要使用反斜杠将其转义。如果您想要在条件中的任何位置使用文字结尾的大括号,那么您也需要使用反斜杠来转义它。加号除了启动条件的
:+
之外没有特殊意义,因此它们不需要转义

另见:

format\u all
标志指定为时,识别的转义序列与上面针对
format\u perl
的转义序列相同。此外,可识别以下形式的条件表达式:

?Ntrue表达式:错误表达式

其中
N
是表示子匹配的十进制数字。如果对应的子匹配参与了完整匹配,则替换为true表达式。否则,这是错误的表达。在此模式下,您可以使用parens
()
进行分组。如果需要文本参数,则必须将其转义为
\(

在Boost替换模式中,必须转义文本

<> PJS软eV2替换字符串条件句的语法与C++ Boost库中的语法相同。 因此,您的正则表达式可以收缩到
(+)[[(?:(dot)|(at))[])](+)

  • (+)
    -第1组:一个或多个空格
  • [[(]
    -a
    [
  • (?:(dot)|(at))
    -要么(第2组)一个
    dot
    子串,要么(第3组)一个
    at
    子串
  • [])]
    -a
    ]
  • (+)
    -第4组:一个或多个空格
并替换为
$1(?{3}.@)$4

  • $1
    -第1组值
  • (?{3}.:@)
    -如果第3组匹配,则替换为
    ,否则替换为
    @
  • $4
    -第4组值
这在记事本++中提供:


您使用哪种编程语言?Java?您到底想要什么?请给出示例输入和输出,并为您使用的语言/工具添加一个标记。哇,从未听说过这些条件,感谢分享!哪些语言/工具支持boost细节?@Bohemian:我添加了所有支持它的3个引擎。@J.ScottElblein:.NET regex不支持条件替换模式。如果您有权访问代码,应该不会有问题。否则,您就不能使用不存在的内容,抱歉。谢谢Tooraj。我在这里使用的是VB/C,因此最终我将使用与.ReplaceAll几乎相同的版本。=)