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”的范围内考虑捕获。)