簡體   English   中英

正則表達式匹配行尾

[英]Regex to match the end of line

我正在尋找BASH正則表達式從下面的命令中拉出'db'agruments。 但是,不保證參數的順序。 出於某種原因,我無法讓它完全發揮作用。

到目前為止我有什么

regex="--db (.*)($| --)"
[[ $@ =~ $regex ]]
DB_NAMES="${BASH_REMATCH[1]}"

# These are example lines
somecommand --db myDB --conf /var/home # should get "myDB"
somecommand --db myDB anotherDB manymoreDB --conf /home # should get "myDB anotherDB manymoreDB" 
somecommand --db myDB # should get "myDB"
somecommand --db myDB anotherDB # should get "myDB anotherDB"

關於正則表達式的任何建議?

問題是bash使用的是一種不包含非貪婪重復運算符( *?+? )的regex 因為*是貪婪的並且沒有辦法告訴它不貪婪,所以第一個帶括號的子表達式( (.*) )匹配到行尾的所有內容。

如果您知道要捕獲的值不包含特定字符並替換,則可以解決此問題. 使用排除該字符的字符類。

例如,如果--db之后的值不包含破折號( - ),則可以使用此regex

regex='--db ([^-]*)($| --)'

它匹配問題中發布的所有示例。

以下作品:

regex="--db[[:space:]]([[:alnum:][:space:]]+)([[:space:]]--|$)"
[[ "$@" =~ $regex ]]

有兩個問題:

  1. 應使用[:space:]等字符類來表示空格
  2. (.*)是貪婪的,並會盡可能的去最后--字面。 由於bash不支持非貪婪匹配,我們必須使用[[:alnum:][:space:]]匹配,這將保證我們在下一個停止--

默認情況下,RegEx嘗試獲得盡可能多的匹配,使用非貪婪(懶惰)量詞。 您可能還想放置--首先讓引擎首先使用它

--db[[:space:]](.*?)([[:space:]]--|$)

演示


如果您不想要-- ,則可以使用非捕獲組

 --db[[:space:]](.*?)(?:[[:space:]]--|$) ^^ Notice the ?: 

演示

我想你想匹配非空格字符來捕捉第一個分組:

regex="--db (\S+)( --|$)"

暫無
暫無

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

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