2017-11-23 1 views
-1
ex = "g4net:HostName=abc}\n Unhandled Exception: \nSystem.NullReferenceException: Object reference not set to an"; 
puts ex[/Unhandled Exception:(.*?):/,0] 

/Unhandled Exception:(.*?):/에서 정규식을 사용하여 문자열에서 부분 문자열하지만 어떤 결과를 표시하지 유지합니다.받기 (Rubular 나 테스트로) <code>nSystem.NullReferenceException</code> 일치해야 루비

enter image description here

나는 루비를 처음입니다. 주어진 문자열에서 /Unhandled Exception:(.*?):/의 일치 항목을 추출하는 방법을 알려주십시오.

+0

Rubular는 '\ n'을 그대로 해석합니다. 동일한 동작을 얻으려면 별도로 선을 삽입해야합니다 (http://rubular.com/r/MOdKAd2Xnl). 힌트 :'.'는'm' 플래그가 설정되어있는 경우에만 뉴 라인과 일치합니다. – Stefan

+1

텍스트를 일치 시키려면 긍정적 인 lookbehind를 사용하십시오 :'puts ex [/ (? <= 처리되지 않은 예외 :). *? :/m]'. – mudasobwa

답변

1

실행 : 여러 줄의 수정이 필요없이,

matchinfo = ex.match(/Unhandled Exception: (.*)/m) 
# Allow "." to match newlines ------------------^ 
matchinfo[1] # => "\nSystem.NullRef..." 

당신은 또한 같은 효과에 대한 문자 클래스 [\s\S] 대신 .를 사용할 수 있습니다 루비에서 당신은 m (다중) 수정을 사용할 수 있습니다

(?m)Unhandled Exception:(.*?): 

코드 :

여러 모드에서 정규식 문제를 해결해야한다
re = /Unhandled Exception:(.*?):/m 
str = 'g4net:HostName=abc} 
Unhandled Exception: 
System.NullReferenceException: Object reference not set to an 
' 

# Print the match result 
str.scan(re) do |match| 
    puts match.to_s 
end 
2

루비 (및 대부분의 다른 언어)는 줄 바꿈 문자와 일치하지 않는 정규 표현식을 기본적으로 .으로 사용합니다.

matchinfo = ex.match(/Unhandled Exception: ([\s\S]*)/) 
# Really match *any* character -------------^----^ 
matchinfo[1] # => "\nSystem.NullRef..." 
+0

여러 줄 수정자가하는 일을 설명해 주셔서 다행입니다. 그것이 간단하지만, 그것에 대해 많은 혼란이있는 것 같습니다. 전에 [\ s \ S]'을 보지 못했습니다. '[\ w \ W]'와'[\ d \ D]'같은 효과가있을 것입니다. –