.net 查找字符串,然后向后查找另一个带有正则表达式的字符串
我基本上有一个txt文件,列出了所有作业定义。我想找出哪些作业使用的全局变量总是(v(someText)格式。是否可以使用正则表达式匹配变量,然后匹配前面的作业名?在本例中,我希望将vaiable1和variable2与jobnameB匹配(理想情况下与捕获组进行两次匹配) 我可以使用以下方法匹配所有变量:.net 查找字符串,然后向后查找另一个带有正则表达式的字符串,.net,regex,vb.net,.net,Regex,Vb.net,我基本上有一个txt文件,列出了所有作业定义。我想找出哪些作业使用的全局变量总是(v(someText)格式。是否可以使用正则表达式匹配变量,然后匹配前面的作业名?在本例中,我希望将vaiable1和variable2与jobnameB匹配(理想情况下与捕获组进行两次匹配) 我可以使用以下方法匹配所有变量: \(v\((.*?)\) 所有的工作都是这样的: insert_job: (\S*?)\s 但我希望有条件地匹配变量存在时的jobname。 或者regex不是实现这一点的最佳方法吗?您
\(v\((.*?)\)
所有的工作都是这样的:
insert_job: (\S*?)\s
但我希望有条件地匹配变量存在时的jobname。
或者regex不是实现这一点的最佳方法吗?您可以使用
(?<=/\*\s*-+\s(?<jobname>\w+)\s*-+\s*\*/(?:(?!/\*\s*-+).)*)\(v\((?<var>[^()]*)\)
(?无需使用昂贵的可变长度查找。
这里没有精美的表格、图表、图表或演示链接。
只是更好的解决方案
利用C#的力量完成一些事情。
CaptureCollections是你的朋友
(?ms)
^ [ \t]* /\* [\s-]*
( \w* ) # (1)
[\s-]* \*/
(?:
(?:
(?!
^ [ \t]* /\* [\s-]*
\w*
[\s-]* \*/
)
.
)*?
\(v\( [ \t]*
( \w+ ) # (2)
[ \t]* \)
)+
C#示例,请参见此处=>
VB.net示例
翻译自C#样本
更新说明-这是一个工作的VB.net版本,
您可以在这里看到=>
在我的原始翻译中,我没有意识到VB不能访问元素
使用方括号表示法[]
显然,它们的数组访问是用括号表示的()
除此之外,它与上面的C完全相同
注意,我无法使示例在CDATA元素中工作。
我在Dotnetfiddle上使用了导入核心、Xml和Linq,但没有成功。
我将示例转换为老式的多行VB字符串方式
VB示例
Imports System
Imports System.Text.RegularExpressions
Public Module Module1
Public Sub Main()
Dim sAllJobs As String = " /* ----------------- jobnameA ----------------- */" & Environment.NewLine & _
" " & Environment.NewLine & _
" insert_job: jobnameA job_type: CMD " & Environment.NewLine & _
" date_conditions: 0 " & Environment.NewLine & _
" alarm_if_fail: 1 " & Environment.NewLine & _
" " & Environment.NewLine & _
" " & Environment.NewLine & _
" /* ----------------- jobnameB ----------------- */ " & Environment.NewLine & _
" " & Environment.NewLine & _
" insert_job: jobnameB job_type: CMD " & Environment.NewLine & _
" date_conditions: 1 " & Environment.NewLine & _
" days_of_week: tu,we,th,fr,sa " & Environment.NewLine & _
" condition: s(job1) & s(job2) & (v(variable1) = ""Y"" | s(job1)) & (v(variable2) = ""Y"" & Environment.NewLine " & _
" alarm_if_fail: 1 " & Environment.NewLine & _
" job_load: 1 " & Environment.NewLine & _
" priority: 10 " & Environment.NewLine & _
" " & Environment.NewLine & _
" " & Environment.NewLine & _
" /* ----------------- jobnameC ----------------- */ " & Environment.NewLine & _
" ... "
Dim RxJobs As New Regex("(?ms)^[ \t]*/\*[\s-]*(\w*)[\s-]*\*/(?:(?:(?!^[ \t]*/\*[\s-]*\w*[\s-]*\*/).)*?\(v\([ \t]*(\w+)[ \t]*\))+")
Dim matchJobs As Match = RxJobs.Match(sAllJobs)
Do While matchJobs.Success
Dim ccJobVar As CaptureCollection = matchJobs.Groups(2).Captures
Console.WriteLine("Job Name: {0}", matchJobs.Groups(1).Value )
For ctr As Integer = 0 To ccJobVar.Count - 1
Console.WriteLine(" var{0} = {1}", ctr+1, ccJobVar(ctr).Value)
Next
Console.WriteLine("")
matchJobs = matchJobs.NextMatch()
Loop
End Sub
End Module
输出
Job Name: jobnameB
var1 = variable1
var2 = variable2
Job Name: jobnameB
var1 = variable1
var2 = variable2
.NET(使用VS 2013,用VB编码)理想情况下,一对匹配的变量和jobname…变量的存在应该会推动搜索…或者我希望通过循环匹配,每个变量都有一个组和一个jobname。太棒了!还感谢你间接地将我指向regexstorm…我使用的所有在线测试人员都一直告诉我LookBehind是广告宽度为零(并且没有.NET选项)。我现在就试试看。另外,检查网站以测试.NET正则表达式。我必须将[A-Z0-9\-]替换为\w,以允许使用数字和连字号,但它工作起来很有魅力。谢谢!\w
也匹配数字。要同时匹配连字号,请将其添加到字符类:[\w-]
我想检查一下,但是它在VB.net中可行吗?我已经得到了代码,但是字符串上没有任何匹配项。@EphronClarke-不确定你所说的是否可行。Dot.net引擎涵盖了它支持的所有语言。所以,是的,我想它可行。听起来你好像从未在VB.net中使用过正则表达式。我从来没有这样做过使用vb.net,但我为你发布了一个未经测试的翻译版本。你可能想用谷歌搜索一个MS页面,在C#/vb.net中定义这一切。有很多。谢谢你的帮助,但屈尊俯就不是必要的。我问这是否可行,因为你在强调C#,尽管我说这是在vb中。我也问了(是的,我能自己翻译)当我把你的代码放在VB中时,它不起作用……我没有的是@EphronClarke-没有人在这里为你的需要服务或为你或其他任何人提供按需代码。我用宝贵的时间发布代码是为了帮你的忙,不是为你个人发布的,而是为读者发布的。我们尽量保持礼貌。如果你认为我是居高临下的话ng,你可能会这样看,VB.net从来没有出现在你原来的帖子中,现在你已经两次说,没有与我的正则表达式匹配了
,而“天一样清晰”就在你眼前。如果你喜欢另一个比我更好的答案,对我来说没什么关系,但不要把我的答案涂成不起作用。有趣的是,有些人是这样说的喜欢一边用一只手帮忙,一边用另一只手打。当其他人试图帮助我时,我会尽量保持感激之情,这就是为什么我会一直感谢你的输入,但你把它从轨道上移开了……难道“听起来好像你从来没有在VB.net中使用过正则表达式”看起来像是你在试图保持礼貌吗?这完全是不必要的,而且是毫无根据的。事实上,我试过了我们的建议不起作用。我喜欢别人的回答,因为它用我正在使用的语言解决了我的问题。对不起,你的感情受到了伤害。
Imports System
Imports System.Text.RegularExpressions
Public Module Module1
Public Sub Main()
Dim sAllJobs As String = " /* ----------------- jobnameA ----------------- */" & Environment.NewLine & _
" " & Environment.NewLine & _
" insert_job: jobnameA job_type: CMD " & Environment.NewLine & _
" date_conditions: 0 " & Environment.NewLine & _
" alarm_if_fail: 1 " & Environment.NewLine & _
" " & Environment.NewLine & _
" " & Environment.NewLine & _
" /* ----------------- jobnameB ----------------- */ " & Environment.NewLine & _
" " & Environment.NewLine & _
" insert_job: jobnameB job_type: CMD " & Environment.NewLine & _
" date_conditions: 1 " & Environment.NewLine & _
" days_of_week: tu,we,th,fr,sa " & Environment.NewLine & _
" condition: s(job1) & s(job2) & (v(variable1) = ""Y"" | s(job1)) & (v(variable2) = ""Y"" & Environment.NewLine " & _
" alarm_if_fail: 1 " & Environment.NewLine & _
" job_load: 1 " & Environment.NewLine & _
" priority: 10 " & Environment.NewLine & _
" " & Environment.NewLine & _
" " & Environment.NewLine & _
" /* ----------------- jobnameC ----------------- */ " & Environment.NewLine & _
" ... "
Dim RxJobs As New Regex("(?ms)^[ \t]*/\*[\s-]*(\w*)[\s-]*\*/(?:(?:(?!^[ \t]*/\*[\s-]*\w*[\s-]*\*/).)*?\(v\([ \t]*(\w+)[ \t]*\))+")
Dim matchJobs As Match = RxJobs.Match(sAllJobs)
Do While matchJobs.Success
Dim ccJobVar As CaptureCollection = matchJobs.Groups(2).Captures
Console.WriteLine("Job Name: {0}", matchJobs.Groups(1).Value )
For ctr As Integer = 0 To ccJobVar.Count - 1
Console.WriteLine(" var{0} = {1}", ctr+1, ccJobVar(ctr).Value)
Next
Console.WriteLine("")
matchJobs = matchJobs.NextMatch()
Loop
End Sub
End Module
Job Name: jobnameB
var1 = variable1
var2 = variable2