你想使用scan
這種事情。其基本模式是這樣的:
s.scan(/\w+/)
這會給你所有的連續序列的數組,字字符:
>> "@Identifier('VariableA', 'VariableB', 'VariableX', 'VariableZ')".scan(/\w+/)
=> ["Identifier", "VariableA", "VariableB", "VariableX", "VariableZ"]
你說你可能有任意東西,周圍的圖案的多個實例他們。您可以處理與嵌套scan
S:
s.scan(/@(\w+)\(([^)]+?)\)/).map { |m| [ m.first, m.last.scan(/\w+/) ] }
這將會給你一個數組的數組,每個內部數組將有「標識符」的部分爲第一要素,而「變量」部分作爲一個數組第二個元素。例如:
>> s = "pancakes @Identifier('VariableA', 'VariableB', 'VariableX', 'VariableZ') pancakes @Pancakes('one','two','three') eggs"
>> s.scan(/@(\w+)\(([^)]+?)\)/).map { |m| [ m.first, m.last.scan(/\w+/) ] }
=> [["Identifier", ["VariableA", "VariableB", "VariableX", "VariableZ"]], ["Pancakes", ["one", "two", "three"]]]
如果您可能面臨「變量」位內的轉義引號,那麼您需要更復雜的東西。
上表達的一些注意事項:
@ # A literal "@".
( # Open a group
\w+ # One more more ("+") word characters ("\w").
) # Close the group.
\( # A literal "(", parentheses are used for group so we escape it.
( # Open a group.
[ # Open a character class.
^) # The "^" at the beginning of a [] means "not", the ")" isn't escaped because it doesn't have any special meaning inside a character class.
] # Close a character class.
+? # One more of the preceding pattern but don't be greedy.
) # Close the group.
\) # A literal ")".
你並不真的需要[^)]+?
這裏,只是[^)]+
會做,但我按習慣使用非貪婪形式,因爲這通常是我的意思。該分組用於分離@Identifier
和Variable
部分,以便我們可以輕鬆獲得所需的嵌套數組輸出。
這是完美的!這正是我所尋找的解決方案。現在學習如何創建正則表達式!非常感謝! – Michael
@Michael:我爲你添加了正則表達式的一些註釋。 –
你是最棒的!我非常感謝這方面的幫助。我真的很想用Ruby和正則表達式來更流暢。我甚至不知道你可以在這樣的表達式中做一個邏輯NOT。真的,再次感謝! – Michael