簡體   English   中英

用於命令匹配詞的正則表達式

[英]Regex for command match words

我正在使用諸如set my_key list of values類的命令構建應用程序。

我被“單詞”的匹配所困擾

我的命令始終以set開頭,並且參數之間用空格分隔。 每個參數都可以帶有-_或用引號引起來的包裝(例如:“我的自定義參數”),以允許空格或其他所有字符。

我在這樣的代碼中使用它:

if (preg_match_all('^set\s(("(.*?)")|(\w+)+)?/i', $command, $matches)) {
  // some code  
}

這是我期望的不同可能值

$text                                      | return | $matches

set                                        | TRUE | []
set param                                  | TRUE | ['param']
set "foo foo_bar foo-bar 123 'bar" bar bar | TRUE | ["foo foo_bar foo-bar 123 'bar", "bar", "bar"]
set foo bar foo bar                        | TRUE | ['foo', 'bar', 'foo', 'bar']
set my-word                                | TRUE | ['my-word']
set my_word                                | TRUE | ['my_word']
setttttt                                   | FALSE

這是正則表達式實時示例: https : //regex101.com/r/IAcYWE/1

看到這里使用的正則表達式

(?:^(set)|\G(?!\A)(?=\h+\S))(?:\h+(?|([\w-]+)|"(.*?)")|(?:\h*?$))

結果

輸入

set
set 
set param
set "foo 123 'bar" bar bar
set foo bar foo bar
set my-word
set my_word
setttttt

產量

  • 比賽1
    • 第一組:一set
  • 比賽2
    • 第一組:一set
  • 比賽3
    • 第一組:一set
    • 第2組: param
  • 比賽4
    • 第一組:一set
    • 第2組: foo 123 'bar
  • 比賽5
    • 第2組: bar
  • 第6場
    • 第2組: bar
  • 比賽7
    • 第一組:一set
    • 第2組: foo
  • 第8場
    • 第2組: bar
  • 比賽9
    • 第2組: foo
  • 比賽10
    • 第2組: bar
  • 第11場
    • 第一組:一set
    • 第二組: my-word
  • 第12場
    • 第一組:一set
    • 第2組: my_word

說明

  • (?:^(set)|\\G(?!\\A)(?=\\h+\\S))匹配以下任意一個
    • ^(set)
      • ^在行首處聲明位置
      • (set)從字面上將捕獲set分為捕獲組1
    • \\G(?!\\A)(?=\\h+\\S)
      • \\G在上一場比賽的末尾或首場比賽的字符串開頭聲明位置
      • (?!\\A)負向查找,確保后面的內容不是字符串開頭的位置(基本上使\\G與上一個匹配項結尾的位置匹配,而不是字符串的開頭)
      • (?=\\h+\\S)正向前瞻確保后面的內容匹配
        • \\h+匹配一個或多個水平空間
        • \\S匹配一個非空白字符
  • (?:\\h+(?|([\\w-]+)|"(.*?)")|(?:\\h*?$))匹配以下任意一個
    • \\h+(?|([\\w-]+)|"(.*?)")匹配以下內容
      • \\h+匹配一個或多個水平空白
      • (?|([\\w-]+)|"(.*?)")分支重置組(組中的任何子模式共享相同的編號/名稱/標識符)。 符合以下任一條件
        • ([\\w-]+)將以下內容捕獲到捕獲組2中
          • [\\w-]+匹配集合\\w-中的一個或多個字符(任何單詞字符\\w或連字符-
        • "(.*?)"
          • 從字面上"匹配雙引號"
          • (.*?)多次捕獲任何字符,但次數最少,請捕獲到捕獲組2中
          • 從字面上"匹配雙引號"
    • (?:\\h*?$)符合以下條件
      • \\h*? 匹配任意數量的水平空白字符,但盡可能少
      • $在字符串末尾聲明位置

用法

匹配由設置的組1定義。 參數由正在設置的組2定義。 對於每個第1 比賽,可能存在多個第2 比賽。 每個組2對應於最近的先前組1匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM