2014-02-26 48 views
0

有以下列格式的字符串:它們之間挑戰正則表達式

  • 它可以與任何數目的由雙括號包圍的字符串啓動,可能與白色空間(可以或可以不發生空白) 。
  • 它也可能包含中間用雙括號括起來的字符串。

我正在尋找一個正則表達式,可以從其餘的開始。

例如,給定以下字符串:

{{a}}{{b}} {{c}} def{{g}}hij 

這兩個部分是:

{{a}}{{b}} {{c}} 
def{{g}}hij 

我嘗試這樣做:

/^({{.*}})(.*)$/ 

但是,它也捕獲在克中間:

{{a}}{{b}} {{c}} def{{g}} 
hij 

我嘗試這樣做:

/^({{.*?}})(.*)$/ 

但是,它捕獲只有第一個:

{{a}} 
{{b}} {{c}} def{{g}}hij 
+0

是裏面的人物括號字母(A-ZA-Z0-9_) 。結尾是由非{{something}}字符定義的。而且只會有一個空白。 – HighBoots

+0

@HighBoots字符串不一定是字母數字。開始的結尾由不在{{}}中的內容定義。可以有多個空白。 –

回答

1

這樣可以使第一組中的匹配{{,任何非{}字符1次或多次,}},可能空白零次或多次,並將其存儲。其餘的字符串將在第二組中。如果沒有包含{{}}的零件,則第一組將爲空。這是在JavaScript中。

var str = "{{a}}{{b}} {{c}} def{{g}}hij"; 

str.match(/^\s*((?:\{\{[^{}]+\}\}\s*)*)(.*)/) 

// [whole match, group 1, group 2] 
// ["{{a}}{{b}} {{c}} def{{g}}hij", "{{a}}{{b}} {{c}} ", "def{{g}}hij"] 
+0

這工作,謝謝! –

1

我想我明白了:

var string = "{{a}}{{b}} {{c}} def{{g}}hij"; 

console.log(string.match(/((\{\{\w+\}\})\s*)+/g)); 

// Output: [ '{{a}}{{b}} {{c}} ', '{{g}}' ] 

說明:

  1. (啓動一個組。
  2. (另一個;
  3. \{\{\w+\}\}查找{{A-Za-z_0-9}}
  4. )關閉第二組。
  5. \s*如果存在空格,則計算空格。
  6. )+關閉第一組並查找一個或多個事件。

當它得到任何not-{{something}}類型的數據,它停止。

P.S. - >Complex RegEx takes CPU speed.

0

我不確切地知道爲什麼要分割,但如果字符串中包含def總是def,並且想要將字符串從兩邊分開,那麼可以嘗試類似:

string text = "{{a}}{{b}} {{c}} def{{g}}hij"; 

      Regex r = new Regex("def"); 
      string[] split = new string[2]; 
      int index = r.Match(text).Index; 
      split[0] = string.Join("", text.Take(index).Select(x => x.ToString()).ToArray<string>()); 
      split[1] = string.Join("", text.Skip(index).Take(text.Length - index).Select(x => x.ToString()).ToArray<string>()); 

//輸出:[ '{{A}} {{b}} {{C}}', 'DEF {{G}} HIJ']

+0

「def」只是一個例子......大括號內和大括號之間的字符串可以是任何字符串。 –

+0

哦,好的!然後忘記我的答案:P感謝您的信息! –

1

如何使用preg_split

$str = '{{a}}{{b}} {{c}} def{{g}}hij'; 
$list = preg_split('/(\s[^{].+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
print_r($list); 

輸出:

Array 
(
    [0] => {{a}}{{b}} {{c}} 
    [1] => def{{g}}hij 
) 
1

您可以使用此:

(JAVA)

string[] result = yourstr.split("\\s+(?!{)"); 

(PHP)

$result = preg_split('/\s+(?!{)/', '{{a}}{{b}} {{c}} def{{g}}hij'); 
print_r($result); 
+0

我在PHP中試過這個:** preg_split(「/ \\ s +(?!{)/」,$ mystr); **沒有用 - 我將整個示例字符串放在一個塊中。 –

+0

@ErelSegalHalevi:抱歉,您沒有提及您使用的標籤語言。爲了使它與PHP的工作刪除反斜槓。 –

+0

用單個反斜槓試過 - 相同的結果... –

相關問題