正则表达式匹配某些字符组合而不匹配其他字符组合

3
我需要一个正则表达式来匹配包含字母 ABC 的字符串(1),但是如果一个字母直接在脱字符号(例如,A^)之后出现,则例外(2)。没有连续的脱字符,但是字母和数字可以以所有长度和组合的形式出现。理想情况下,正则表达式应该不使用前瞻语法,因为我想在 Awk 脚本中使用它。
43AA34C563B3545  :  no match
43A34C563^BC3545 :  no match
4334563^B3545    :  match (the only letter is after the caret)
3345664345^CCC0  :  no match
3345             :  match (no letters)

我可以相对容易地使用 ^ [^ABC] + $ 完成 #1,但当我尝试添加扩展时,例如, ^ [^ABC] + $ | ^ [0-9] * \ ^ D + [0-9] + $ 它失败了。

2个回答

2

您可能会使用一种模式来匹配数字,并重复匹配^,后跟[ABC]之一和数字。

^[0-9]+(\^[ABC][0-9]+)*$

正则表达式演示

awk '/^[0-9]+(\^[ABC][0-9]+)*$/ {
  print $0
}

' file

输出

4334563^B3545
3345

或者一个版本,只匹配^B或只匹配数字:

^([0-9]*(\^[ABC][0-9]*)+|[0-9]+)$

正则表达式演示


1

您的匹配项由克拉和 [ABC] 数字组成:

^((\^[ABC])|\d)+$

查看实时演示

如果您的正则表达式不支持\d(例如awk或sed),请将\d替换为[0-9]


很好。在进行了一些小修改后,帮助我将其效果翻倍:'^((^[ABC]+)|\d)+$',它排除了跟在插入符后面的字母串,这正是我需要的!谢谢! - Lechu
然而,在gawk/awk 5.1.0中使用\转义符会出现警告:warning: regexp escape sequence '\d' is not a known regexp operator - Lechu
@LechKaczmarczyk 如果你的工具不支持\d,请使用[0-9]代替... - Bohemian
@LechKaczmarczyk,在gawk中没有\d。请使用字符类:[[:digit:]]。 此外,我不知道您如何使用此正则表达式,但尽可能使用静态正则表达式-用/包围,而不是"-s: awk '/^((\^[ABC])|[[:digit:]])+$/' myFile - vgersh99
@vgersh99,肯定是[0-9][[:digit:]]更容易和简单。 - Bohemian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接