regex 正则表达式,获取char after char before char

b5lpy0ml  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(102)

样品:

[Foo][Bar]Foo bar foo bar: foo; bar: foo bar foo bar __
[Foo][Bar]Foo; **b**ar: foo bar __ foo bar foo bar
[Foo]Foo bar foo bar foo bar: foo __ bar; foo bar __ foo bar
[Bar]Foo; **b**ar; **f**oo

例如,我有一个像上面这样的字符串格式。
我想问的是,如何得到;上的冒号之后的字母(不是空格或白色空格),但在第一个冒号:之前?
如果可能的话,我想用正则表达式一步标记字母
我想得到的字母用粗体标出

  • 作为补充信息,我想将字母改为。
bhmjp9jg

bhmjp9jg1#

使用两个查找范围从要匹配的字符中排除周围环境:

(?<=              # Match something preceded by
  ^[^:]*;\s*      # the start of the line, 0 or more non-colons, a semicolon and any whitespaces
)                 # that is
[^\s:]            # not a colon and not a whitespace
(?=               # which must be followed by
  [^:]*(?:$|:)    # 0 or more non-colons, then either the end of the line or the first colon.
)                 #

试试on regex101.com
[^:];\s[^\s:]从不匹配冒号,所以lookahead中的冒号匹配 iff 它是该行的第一个冒号。如果没有冒号,我们简单地回退到行尾,因此允许主表达式匹配。
正则表达式需要有多行修饰符((?m)/RegexOptions.Multiline)。我不知道VB.NET,但下面的代码段似乎可以工作:

Sub Main()
  Dim regex As New Regex("(?<=^[^:]*;\s*)[^\s:](?=[^:]*(?:$|:))", RegexOptions.Multiline)
  Dim input As String =
    "[Foo][Bar]Foo bar foo bar: foo; bar: foo bar foo bar __" & vbCrlf &
    "[Foo][Bar]Foo; bar: foo bar __ foo bar foo bar" & vbCrlf &
    "[Foo]Foo bar foo bar foo bar: foo __ bar; foo bar __ foo bar" & vbCrlf &
    "[Bar]Foo; bar; foo"
  
  Console.WriteLine(regex.Replace(input, AddressOf ConvertToUppercase))
End Sub

Function ConvertToUppercase(match As Match) As String
  Return match.Groups(0).Value.ToUpper()
End Function

试试on ideone.com

o4hqfura

o4hqfura2#

^[^;:]*;\s*(.).*:
  • ^-行锚的起点
  • [^;:]*-匹配;:以外的任何对象零次或多次
  • ;-匹配文字;
  • \s*-匹配零个或多个空格
  • (.)-捕获一个字符
  • .*-匹配任何字符零次或多次
  • :-匹配文本冒号

Demo
由于您还说希望在[Bar]Foo; bar; foo中捕获bf,因此实际上似乎不需要冒号。
下面是一个捕获bf的例子:

^(?:[^;:]*;\s*(.))+
  • ^-线路锚起点
  • (?:-非捕获组的开始
  • [^;:]*-除了;:之外的任何字符匹配零次或多次
  • ;-匹配文字;
  • \s*-零次或多次匹配空白
  • (.)-捕获一个字符。如果不允许它是:,则替换为([^:])
  • )-非捕获组的结束
  • +-匹配非捕获组1次或更多次

Demo

相关问题