【问题标题】:Match all characters in a line between matching symbols or end of the row匹配匹配符号之间或行尾之间的行中的所有字符
【发布时间】:2018-11-30 08:09:26
【问题描述】:

我想匹配| 和行尾之间的所有单词(车辆和所有车辆名称)。我不希望多余的行匹配

我已经开始使用这个正则表达式,但这不会排除符号|

^\|.*$

然后我尝试了这种语法,但它忽略了行中的最后一个单词:

(?<=\|)(.*)(?=\|)

样品:

上面的文字我不想匹配

| VEHICLE | Truck | | Bike
| VEHICLE | Car          | | Scooter
| VEHICLE | Sedan | Mini Van    | 
| VEHICLE | Sedan | white, brown, black |     
| VEHICLE | Sedan | pack/cars   | 

下面我不想匹配的文字

【问题讨论】:

  • 我看到你已经给出了一些例子。你能告诉我你想匹配哪些位吗?

标签: regex


【解决方案1】:

要仅匹配单词,您可以首先匹配一个竖线和一个空格字符。然后在一组中捕获一个或多个单词字符,然后使用正数 lookahead 检查右侧的内容是空白字符还是字符串的结尾。

您的值在第一个捕获组中。

\|\s(\w+)(?=\s\||$)

说明

  • \|\s 匹配 | 和一个空白字符
  • (\w+)在一组中捕获1+空白字符
  • (?=\s\||$) 肯定前瞻断言后面的内容是字符串末尾的空白字符

Regex demo

更新:

仅匹配 Sublime 中的单词,包括您可以使用的匹配 1+ 个标签:

\|\h+\K\w+(?:[,\/]?\h*\w+)*(?=\h*(?:\||$))

Regex demo

说明

  • \|\h+ 匹配一个管道,后跟 1+ 个水平空白字符
  • \K忘记当前匹配的内容
  • \w+匹配1+单词字符
  • (?:非捕获组
    • [,\/]?\h*\w+ 匹配可选的逗号或正斜杠,后跟 0+ 次水平空白字符和 1+ 单词字符
  • )*关闭非捕获组并重复0+次
  • (?= 肯定的前瞻断言接下来是
    • \h* 匹配 0+ 个水平空白字符
    • (?:\||$) 匹配管道或字符串的结尾
  • ) 关闭正向预测

【讨论】:

  • 答案几乎可以工作,但有两个问题:1.它不捕获标签后面跟着的单词 2.它包括|,我想排除它,因为我正在使用它在 Sublime 语法文件中
  • 抱歉,我发现我的示例数据中存在另一个我应该指出的复杂情况。有时要捕获的单词超过 1 个单词和/或以逗号分隔的列表:a) Mini Van b) car, van, truck c) pack/cars 如何修改 \w+ 行以捕获这些用例
  • @TommyWu 你是这个意思吗? \|\h+\K\w+(?:[,\/]?\h*\w+)*(?=\h*(?:\||$))See demo
  • 完全正确,谢谢!现在我只需要弄清楚为什么它在我的 Sublime 语法荧光笔中不起作用。
  • 对不起,我误解了你的意思。是的,使用正则表达式的 Sublime Search 会找到正确的匹配项。语法文件(YAML 格式)似乎没有找到任何匹配项
【解决方案2】:

重复任何字符在中间有一个|,在前瞻中,在|和行尾之间交替:

(?<=\|)([^\|]+)(?=\||$)

https://regex101.com/r/YmtEPE/1

请注意,中间可能不需要捕获组,反正它相当于整个匹配。

【讨论】:

    【解决方案3】:

    你可以使用

    [^|\s](?:[^|]*[^|\s])?
    

    regex demo

    详情

    • [^|\s] - 任何字符,但 | 和空格
    • (?:[^|]*[^|\s])? - 除| 之外的任何0+ 字符的可选序列,后跟除| 和空格之外的任何字符。

    【讨论】:

    • 您的解决方案非常适合这部分文本,但我在同一文件的其他行中有常规文本。我将如何修改您在上面提供的文本以仅包含以 | 开头的行?>
    • @TommyWu 你可能想要(?:\G(?!\A)\h*\|\h*|^\|\h*)\K(?:[^|\s](?:[^|]*[^|\s])?)?,见demo
    【解决方案4】:

    你可以选择:

    (?<=\| *)[^|\s]+(?= *\||$)
    

    详情

    • [^|\s]+ - 匹配除空格和| 1 次以上的所有字符。
    • $ - 匹配字符串的结尾(或启用m 标志时的一行)。

    Demo here

    更新:

    (?&lt;=\| *)(?! +)[^|]+(?= *\||$)

    【讨论】:

    • 您的语法似乎很好用,但我注意到 2 个问题:1) 它不允许在任何单词之后出现制表符空白 2) 看起来 Sublime 的语法荧光笔 (YAML) 不会接受它。有什么想法吗?
    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2020-06-30
    相关资源
    最近更新 更多