regex - 在可选的连字符正则表达式之间捕获单词

标签 regex perl hyphen

我有以下类型的字符串,

abc - xyz
abc - pqr - xyz
abc - - xyz
abc - pqr uvw - xyz

我想检索文本 xyz从第一个字符串和 pqr来自第二个字符串,``(空)来自第三个 & pqr uvw .第二个连字符是可选的。 abc是静态字符串,它必须在那里。我试过以下正则表达式,
/^(?:abc) - (.*)[^ -]?/

但它给了我以下输出,
xyz
pqr - xyz
- xyz
pqr uvw - xyz

我不需要第二个字符串中的最后一部分。我正在使用 perl 编写脚本。可以通过正则表达式完成吗?

最佳答案

请注意 (.*) part 是一个贪婪的量化点,它尽可能多地抓取除换行符以外的任何 0+ 字符,直到行尾和 [^ -]? ,由于 ? 能够匹配空字符串量词(1 或 0 次重复),匹配行尾的空字符串。因此,pqr - xyz abc - pqr - xyz 的输出仅适用于正则表达式引擎。

您需要在此处使用更严格的模式。例如。

/^abc\h*-\h*((?:[^\s-]+(?:\h+[^\s-]+)*)?)/

regex demo .

详情
  • ^ - 字符串开头
  • abc - 一个 abc
  • \h*-\h* - 用 0+ 个水平空格括起来的连字符
  • ((?:[^\s-]+(?:\h+[^\s-]+)*)?) - 第 1 组捕获可选出现的
  • [^\s-]+ - 除了空格和 - 之外的 1 个或多个字符
  • (?:\h+[^\s-]+)* - 零次或多次重复
  • \h+ - 1+ 个水平空白
  • [^\s-]+ - 除了空格和 - 之外的 1 个或多个字符
  • 关于regex - 在可选的连字符正则表达式之间捕获单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768612/

    相关文章:

    perl - 我可以使用 Perl 的 DBI 从 SQL 查询中获取表名吗?

    Perl 中的 Mysql 查询参数问题

    string - Lua string.gsub带连字符

    C++ 正则表达式失败,而在线检查器正常

    python - 在 Python MULTILINE 模式下仅匹配字符串的开头

    .Net 新的正则表达式(@"[ ]{2,}",选项)意味着什么

    perl - 如何将数据推送到多维数组?

    php - 如何解决mySQL插入查询中的连字符问题

    javascript - 正则表达式匹配其中不含短语的短语