Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Regex 替换忽略非捕获组_Regex_Vb.net - Fatal编程技术网

Regex 替换忽略非捕获组

Regex 替换忽略非捕获组,regex,vb.net,Regex,Vb.net,为什么Regex.Replace忽略我的非捕获组?我正在删除出现在文件名末尾的括号内的数字,无论后面是0、1还是2扩展名。比如说, 无论如何(54.xml) 将成为 whatever.xml 这不起作用: Private Function FixFileName(ByVal fn As String) As String Static rgx As New Regex("(\(\d+\))(?:(\.\w{2,3}){0,2})$") Return rgx.Replace(fn,

为什么
Regex.Replace
忽略我的非捕获组?我正在删除出现在文件名末尾的括号内的数字,无论后面是0、1还是2扩展名。比如说,

无论如何(54.xml)

将成为

whatever.xml

这不起作用:

Private Function FixFileName(ByVal fn As String) As String
    Static rgx As New Regex("(\(\d+\))(?:(\.\w{2,3}){0,2})$")
    Return rgx.Replace(fn, "", 1)
End Function
它会删除数字后的扩展,即使我没有捕获它们。这项工作:

Private Function FixFileName(ByVal fn As String) As String
    Static rgx As New Regex("(\(\d+\))((\.\w{2,3}){0,2})$")
    Return rgx.Replace(fn, "$2", 1)
End Function
通过捕获并重新插入扩展(如果有)

一些测试代码:

Option Strict On
Option Explicit On

Imports System.Text.RegularExpressions

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RichTextBox1.WordWrap = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles Button1.Click
        Dim filenames() As String = {"wibble(a).xml", "blah (blah( blah)).xml", "blah(54)",
                                     "blahblah(433).xml", "blah(2)blah(500)", "blah(23)blah(500).xml",
                                     "blah(23)blah(500).xml.doh"}

        For Each filename As String In filenames
            RichTextBox1.AppendText(filename & " --> " & FixFileName(filename) & vbNewLine)
        Next
    End Sub
此图像可能有用:


我想知道这是故意的还是我的正则表达式有问题?以及尝试
正向前瞻断言是否可行。

无论您是否创建捕获,都将替换整个匹配。发件人:


在指定的输入字符串中,替换与 具有指定替换字符串的正则表达式模式


这是出于设计,也是所有regex口味的预期行为。如果您是正确的,您需要为扩展使用一个组,并在替换中反向引用它

额外注释:不需要在
(\(\d+\)
中使用组,因为您不需要捕获它(或者至少在您提供的示例中不需要)<代码>\(\d+\)
也可以正常工作

同样,您是对的,您可以使用,来断言,而不使用匹配中的字符

正则表达式:(扰流板)

\(\d+\)(?=(?:\。\w{2,3}){0,2}$)

  • 将鼠标移到上面的块上,查看具有前瞻性的正则表达式(问题中不清楚您是想要解决方案还是只知道它是否有效)
输出:

wibble(a).xml-->wibble(a).xml
废话(废话(废话)).xml-->废话(废话(废话)).xml
废话(54)-->废话
blahblah(433.xml-->blahblah.xml
废话(2)废话(500)->废话(2)废话
blah(23)blah(500).xml-->blah(23)blah.xml
blah(23)blah(500).xml.doh-->blah(23)blah.xml.doh

您是否希望替换
()
中的两组数字(例如
blah(23)blah(500)。xml.doh
将导致
blahblah.xml.doh
?`很抱歉,回复太晚,只是任何扩展之前的最后一组数字。谢谢。我怀疑这是故意的,只是找不到一个明确的说法说不捕获将被忽略。事实上,这是因为不捕获不会被忽略,也不会考虑捕获。它会替换整个匹配,即使使用捕获组、非捕获组或无。谢谢。(在替换术语中使用“$2”的范围内考虑捕获。)