복붙노트

[SCALA] 스칼라 정규식은 여러 줄 옵션을 사용

SCALA

스칼라 정규식은 여러 줄 옵션을 사용

이 아마 꽤 멍청한 놈 - irific 그래서 나는 스칼라를 배우는 중이에요.

나는 여러 정규 표현식을 갖고 싶어.

루비가 될 것이다 :

MY_REGEX = /com:Node/m

내 스칼라 외모와 같은 :

val ScriptNode =  new Regex("""<com:Node>""")

여기 내 match 함수는 다음과 같습니다

def matchNode( value : String ) : Boolean = value match 
{
    case ScriptNode() => System.out.println( "found" + value ); true
    case _ => System.out.println("not found: " + value ) ; false
}

그리고 나는 그렇게처럼 호출하고 있습니다 :

matchNode( "<root>\n<com:Node>\n</root>" ) // doesn't work
matchNode( "<com:Node>" ) // works

난 노력 했어:

val ScriptNode =  new Regex("""<com:Node>?m""")

그리고 있으며, java.util.regex.Pattern를 사용하는 것을 피하기 위해 정말 좋아 것입니다. 모든 팁이 크게 감사합니다.

해결법

  1. ==============================

    1.스칼라 정규식을 사용하는 경우 먼저 이것은 매우 일반적인 문제입니다.

    스칼라 정규식을 사용하는 경우 먼저 이것은 매우 일반적인 문제입니다.

    당신은 스칼라에 패턴 매칭을 사용할 때 당신이 "^"와 "$"를 사용하는 것처럼, 그것은 전체 문자열을 일치 시키려고 (어느 일치 \ n ^ 및 $, 다중 회선 구문 분석을 활성화하지 않았다).

    하는 방법은 다음 중 하나가 될 것입니다 원하는 것을 할 수 있습니다 :

    def matchNode( value : String ) : Boolean = 
      (ScriptNode findFirstIn value) match {    
        case Some(v) => println( "found" + v ); true    
        case None => println("not found: " + value ) ; false
      }
    

    어떤 ScriptNode의 내부 값의 첫 번째 인스턴스를 찾아 찾아 (당신이 전체 문자열을 원하는 경우, 단지 값을 출력) V로 해당 인스턴스를 반환합니다. 그렇지 않으면:

    val ScriptNode =  new Regex("""(?s).*<com:Node>.*""")
    def matchNode( value : String ) : Boolean = 
      value match {    
        case ScriptNode() => println( "found" + value ); true    
        case _ => println("not found: " + value ) ; false
      }
    

    어느 모든 모든 값을 출력한다. 이 예에서 (?들) DOTALL (즉, 일치 "."새로운 라인) 매칭 및 활성화됩니다. (가) 검색-에 대한 전후 * 패턴 보장하지만이 모든 문자열과 일치합니다. 첫 번째 예에서와 같이 "V"를 원한다면, 당신이 할 수 있습니다 :

    val ScriptNode =  new Regex("""(?s).*(<com:Node>).*""")
    def matchNode( value : String ) : Boolean = 
      value match {    
        case ScriptNode(v) => println( "found" + v ); true    
        case _ => println("not found: " + value ) ; false
      }
    
  2. ==============================

    2.그냥 신속하고 더러운 부록 : 당신이 이런 식으로 뭔가를 할 수 있도록, scala.util.matching.Regex로 변환 모든 문자열을 RichString에 .R 방법 :

    그냥 신속하고 더러운 부록 : 당신이 이런 식으로 뭔가를 할 수 있도록, scala.util.matching.Regex로 변환 모든 문자열을 RichString에 .R 방법 :

    """(?s)a.*b""".r replaceAllIn ( "a\nb\nc\n", "A\nB" )
    

    그리고 그 반환

    A
    B
    c
    

    나는 스칼라 콘솔에서 신속하고 더러운 정규식 스크립팅이 모든 시간을 사용합니다.

    또는이 경우 :

    def matchNode( value : String ) : Boolean = {
    
        """(?s).*(<com:Node>).*""".r.findAllIn( text ) match {
    
           case ScriptNode(v) => System.out.println( "found" + v ); true    
    
           case _ => System.out.println("not found: " + value ) ; false
        }
    }
    

    그냥 내 시도는 코드 세계의 새로운 단어 사용을 줄일 수 있습니다. ;)

  3. ==============================

    3.그냥 작은 또한, 사용은 그것을 사용하는 올바른 방법은 여기 (이 여기에 적합하지 않을 수도 있지만)을 (? m) (여러 줄) 플래그를 사용하지만, 시도 :

    그냥 작은 또한, 사용은 그것을 사용하는 올바른 방법은 여기 (이 여기에 적합하지 않을 수도 있지만)을 (? m) (여러 줄) 플래그를 사용하지만, 시도 :

    예를 들면 대신에

    val ScriptNode =  new Regex("""<com:Node>?m""")
    

    용도

    val ScriptNode =  new Regex("""(?m)<com:Node>""")
    

    그러나 다시 (? s에) 플래그 (제목은 "스칼라 정규식 여러 줄 옵션을 사용"에만 있기 때문에이 답변 추가)이 질문에 더 적합

  4. from https://stackoverflow.com/questions/1088554/scala-regex-enable-multiline-option by cc-by-sa and MIT license