为什么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
该图像可能是有用的:
我想知道这是否是设计或如果有什么错我的正则表达式?是否尝试positive lookahead assertion
可能会起作用。
您是否在考虑之内'()',(如更换两个组数字。 'blah(23)blah(500).xml.doh'会导致'blahblah.xml.doh'?' –
对不起,延迟回复,只是最后一组设置之前的任何扩展名。 –