이런 종류의 작업에는 scan
을 사용하고 싶습니다. 기본 패턴이 될 것이다 :
단어 문자 당신에게 모든 연속적인 순서의 배열을 줄 것이다
s.scan(/\w+/)
:
>> "@Identifier('VariableA', 'VariableB', 'VariableX', 'VariableZ')".scan(/\w+/)
=> ["Identifier", "VariableA", "VariableB", "VariableX", "VariableZ"]
을 당신이 임의의 물건을 주위와 패턴의 여러 인스턴스가있을 수 있습니다 말한다 그들. 당신은 중첩 된 scan
들과 그 처리 할 수
당신은 배열의 배열을 줄 것이다
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
@ 마이클 : 당신을 위해 정규 표현식에 몇 가지 메모를 추가했습니다. –
당신은 최고입니다! 이것에 대한 도움을 정말 고맙게 생각합니다. Ruby와 Regular Expressions에 더 익숙해 지려고 노력 중입니다. 나는 그런 식으로 논리적 인 NOT을 할 수 있다는 것을 몰랐다. 진심으로, 다시 한번 감사드립니다! – Michael