.net 查找字符串,然后向后查找另一个带有正则表达式的字符串

.net 查找字符串,然后向后查找另一个带有正则表达式的字符串,.net,regex,vb.net,.net,Regex,Vb.net,我基本上有一个txt文件,列出了所有作业定义。我想找出哪些作业使用的全局变量总是(v(someText)格式。是否可以使用正则表达式匹配变量,然后匹配前面的作业名?在本例中,我希望将vaiable1和variable2与jobnameB匹配(理想情况下与捕获组进行两次匹配) 我可以使用以下方法匹配所有变量: \(v\((.*?)\) 所有的工作都是这样的: insert_job: (\S*?)\s 但我希望有条件地匹配变量存在时的jobname。 或者regex不是实现这一点的最佳方法吗?您

我基本上有一个txt文件,列出了所有作业定义。我想找出哪些作业使用的全局变量总是(v(someText)格式。是否可以使用正则表达式匹配变量,然后匹配前面的作业名?在本例中,我希望将vaiable1和variable2与jobnameB匹配(理想情况下与捕获组进行两次匹配)

我可以使用以下方法匹配所有变量:

\(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