[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.스칼라 정규식을 사용하는 경우 먼저 이것은 매우 일반적인 문제입니다.
스칼라 정규식을 사용하는 경우 먼저 이것은 매우 일반적인 문제입니다.
당신은 스칼라에 패턴 매칭을 사용할 때 당신이 "^"와 "$"를 사용하는 것처럼, 그것은 전체 문자열을 일치 시키려고 (어느 일치 \ 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.그냥 신속하고 더러운 부록 : 당신이 이런 식으로 뭔가를 할 수 있도록, 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.그냥 작은 또한, 사용은 그것을 사용하는 올바른 방법은 여기 (이 여기에 적합하지 않을 수도 있지만)을 (? m) (여러 줄) 플래그를 사용하지만, 시도 :
그냥 작은 또한, 사용은 그것을 사용하는 올바른 방법은 여기 (이 여기에 적합하지 않을 수도 있지만)을 (? m) (여러 줄) 플래그를 사용하지만, 시도 :
예를 들면 대신에
val ScriptNode = new Regex("""<com:Node>?m""")
용도
val ScriptNode = new Regex("""(?m)<com:Node>""")
그러나 다시 (? s에) 플래그 (제목은 "스칼라 정규식 여러 줄 옵션을 사용"에만 있기 때문에이 답변 추가)이 질문에 더 적합
from https://stackoverflow.com/questions/1088554/scala-regex-enable-multiline-option by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 멀티 클래스 분류 예 불꽃 (0) | 2019.11.28 |
---|---|
[SCALA] 어떻게 JSON으로 DataFrame를 변환하는? (0) | 2019.11.28 |
[SCALA] 어떻게 두 DataFrames 사이의 대칭 차이를 구하는 방법? (0) | 2019.11.28 |
[SCALA] 어떻게 실패에도 불구하고 미래의 순서를 실행을 계속합니다? (0) | 2019.11.28 |
[SCALA] 어떻게 스칼라의 연속성을 사용할 수 있습니까? (0) | 2019.11.28 |