2017-03-20 31 views
2

我需要使用正則表達式匹配一個單詞,該單詞位於最多帶有1和2個反引號的反引號/反引號之間。用特定的引用組合匹配單詞

匹配情況

  1. 字應與一個或兩個後引號開始,並用N-反引號結束
  2. 字應該是N-反引號開始,並用一個或兩個反引號
結束

不應該匹配

  1. Word啓動並超過三個反引號

結束例

I `need` to match a ``word`` from a ```sentence`` 
Which `lies`` between `backquotes```` and this ``should```` also match 
and ```more``` than ```three```````` quotes ```````not``` matched 

匹配:

  1. 需要
  2. 在於
  3. 後引號
  4. 應該

嘗試

Pattern PATTERN = Pattern.compile("`{1,2}\\w+|\\w+`{1,2}", Pattern.DOTALL); 
+0

爲什麼你使用'DOTALL'當模式甚至不包含任何圓點? – OrangeDog

回答

5

您可以使用

(?<!`)`{1,2}\b(?!`)(.*?)\b`+ 

regex demo。獲取組1的值。

詳細

  • (?<!`) - 1或2 `匹配
  • \b - - 字邊界需要下一個字符是當前的位置不應該與一個`
  • `{1,2}之前一個字char
  • (?!`) - 1或2反引號後的下一個字符不能成爲backtrick
  • (.*?) - 匹配並捕獲任何0+字符(考慮使用Pattern.DOTALL跨線匹配)
  • \b - 1以上反引號 - 字邊界,下一個反引號應與字炭
  • `+之前。

Java demo

String s = "I `need` to match a ``word`` from a ```sentence`` Which `lies`` between `backquotes```` and this ``should```` also match and ```more``` than ```three```````` quotes ```````not``` matched"; 
Pattern pattern = Pattern.compile("(?<!`)`{1,2}\\b(?!`)(.*?)\\b`+"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(1)); 
} 
+0

@EduardoDennis:不,它[將使用引號](https://regex101.com/r/j6VvVk/1),如果OP要匹配不以字符開頭和結尾的字符串,它將不起作用。但是,目前的投入建議。 –

+0

@EduardoDennis:我認爲OP使用*反引號*和*反引號*作爲同義詞。 –

+0

由於單詞字符不能反引號,所以'\ b(?!\')'不能簡化爲'\ w'(或者'[\ d \ p {L}]')。並且由於OP在單個單詞之後wouldn'\ w +'而不是'\ b(?!\')(。*?)\ b'是否足夠? – Thomas