确保字符串中存在特定字符

时间:2016-03-02 23:08:07

标签: regex

我正在使用以下正则表达式来解析我的应用程序日志文件以搜索特定字符串

\[\s*\b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200}))*(\.?|\b)\s*]

这很好但现在我们需要确保字符串“must”包含要匹配的“ - ”字符。我很困惑将此条件添加到原始regx。 任何指针都会有所帮助。

谢谢和问候, Santhosh

4 个答案:

答案 0 :(得分:2)

正则表达式匹配方括号[]内的字符串,并且可能只包含非[和非]符号。

您可以在开始[后轻松添加正向前瞻限制,例如检查][以外的其他字符是否跟- < / EM>:

\[                                            # opening [
  (?=[^\]\[]*-)                               # There must be a hyphen in [...]
  \s*                                         # 0+ whitespaces
  \b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})     # Part 1 (with obligatory subpattern)
  (?:\.                                       # Part 2, optional
       (?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200})
  )*
  (\.?|\b)                                    # optional . or word boundary
\s*                                           # 0+ whitespaces 
]                                             # closing ]

请参阅regex demo

one-liner

\[(?=[^\]\[]*-)\s*\b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200}))*(\.?|\b)\s*]

提示:使用详细/x修饰符将模式拆分为单独的多行块进行分析,将来当您需要再次修改模式时,它将帮助您。

如果仅在-内有@[...]时才需要匹配,请将前瞻修改为(?=[^\]\[]*[-@])。对于更一般的情况,请在前瞻内的其他组中使用(?=[^\]\[]*(?:one|another|must-be-present))个替代方案。

答案 1 :(得分:1)

更新的答案 - 断言

在这种情况下,更好的方法是使用一个断言,该断言只检查预期与相关字符匹配的位置。

我知道这很简单,但使用 outter 伪锚文本\[ ... \]作为
一个不存在于体内的分隔符是罕见的。

你应该总是尽量避免这样做。
事情发生变化,你的意见可能会发生变化 验证 Mid-String 的已知字符时要遵循的规则是仅使用它们 使用断言验证器时。

这避免了必须依赖目前不存在的内容,即不是]
但应该依赖那里的

同样,这与 mid-string 匹配有关 BOL / EOL完全不同^$,是一种更永久的结构 利用它。

智能编码总是更好。

\[\s*\b(?=[0-9A-Za-z][0-9A-Za-z_.#]{0,199}-|[0-9A-Za-z][0-9A-Za-z_.#]{0,200}(?:\.[0-9*A-Za-z][0-9A-Za-z_.#]{0,200})*\.[0-9*A-Za-z][0-9A-Za-z_.#]{0,199}-)(?:[0-9A-Za-z][0-9A-Za-z_.#-]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z_.#-]{0,200}))*(\.?|\b)\s*\]

使用条件

如果您的发动机支持条件,那么简单的方法就是不要依赖侥幸 伪锚文本,即。 [..]

\[\s*\b[0-9A-Za-z](?:[0-9A-Za-z_.#]|(-)){0,200}(?:\.(?:[0-9*A-Za-z](?:[0-9A-Za-z_.#]|(-)){0,200}))*(\.?|\b)\s*\](?(1)|(?(2)|(?!)))

扩展

 \[ \s* \b 
 [0-9A-Za-z] 
 (?:
      [0-9A-Za-z_.#] 
   |  ( - )                         # (1)
 ){0,200}
 (?:
      \.
      (?:
           [0-9*A-Za-z] 
           (?:
                [0-9A-Za-z_.#] 
             |  ( - )                         # (2)
           ){0,200}
      )
 )*
 ( \.? | \b )                  # (3)
 \s* \]

 (?(1)                         # Fail if no dash found
   |  (?(2)
        |  (?!)
      )
 )

答案 2 :(得分:0)

如果只想确保 - 在运行代码块之前发生在字符串中,则此条件将起作用。

audience:server:client_id:projectid-somestring.apps.googleusercontent.com

答案 3 :(得分:0)

如果你必须有连字符,你必须重复大部分模式,或者在第二阶段检查它:

if re.match(pattern, line):
    if not '-' in line:
        raise MissingDash('No dash in line: {}'.format(line))

我建议添加第二张支票,因为将要求添加到正则表达式会使阅读更加糟糕。