【问题标题】:REGEX: \Z in character class正则表达式:字符类中的 \Z
【发布时间】:2013-02-03 12:10:44
【问题描述】:

正则表达式:

((?<=blah)[^@\Z]+)

它应该捕获以blah 开头并以@ 或字符串结尾的符号符号。 将\Z 包含在字符类中是否正确?

【问题讨论】:

  • 你匹配的东西 not @^ 否定字符组),但你的叙述表明这是一个错误。你能澄清一下吗?
  • “结束”是指序列必须以该字符结尾(或字符串结尾)进行限制
  • 那么你应该使用^插入符号来否定字符类。
  • 为什么? Matcher 首先匹配 'blah',然后在从 [^] 中找到符号之前捕获一个或多个字符 - 这是我的逻辑
  • 所以你想匹配blahsomethingnottheend@blahsomethingnottheend

标签: python regex character-class


【解决方案1】:

不,字符类只能包含文字字符或其他字符类;您的示例匹配任何 @\Z 锚点,因为它本身不是字符类,所以会被忽略。请注意,^ 插入符号否定字符组。改用带有|“或”符号的组:

((?<=blah)(?:[^@]+|\Z))

我在那里使用了一个非捕获组 ((?:...)) 对这两个选项进行分组。该组匹配 not @ 的任何字符,它匹配 \Z 字符串结尾锚点。

【讨论】:

  • 谢谢!这个正则表达式是贪婪的还是非贪婪的?
  • @GillBates:+ 是贪婪的,在它后面添加一个? 使其不贪婪。
  • 也许用户负前瞻而不是非捕获组更好?
  • @GillBates:这完全取决于您要匹配的内容。 Look-ahead 和look-behind 用于锚定匹配,它们本身不是匹配字符的一部分。将它们用作\Z^$ 的高级版本。
  • 从技术上讲,字符类可以包含非文字字符的内容。关键是它们包含的任何内容都必须解析为单字符元素,而\Z 表示(?:\n?\z),因此不起作用。另一种说法是不能在字符类中设置边界,因为边界不是字符。
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2017-08-14
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多