2017-12-16 3 views
0
내가에서 아티스트, 노래와 정수 추출 할

:이 정규식을 사용하고추출 문자열과 정수

'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0 

:

"""(?<=')(.+?)(?=')|(\d)""".r 

어떻게 튜플에이 변환을? 출력

(WATTS 103RD STREET RHYTHM BAND, DO YOUR THING, 0)

처럼 보이는 어떻게 내가 그러한 모든 라인 파일에

'Artist', 'Song', int(0 or 1) [Line format] 

이 튜플 변환을 할 수있는지도 기능을 추가하는 방법은 무엇입니까?

저는 스칼라에 완전히 익숙하지 않아 실마리가 없습니다.

+0

입력을 튜플로 구문 분석하는 방법을 보여줄 수 있습니다. 그러나 입력 및 출력 형식의 차이점은 무엇입니까? 내가 지금 볼 수있는 것에서는 차이점이 없다. 특히 귀하의 특정 입력에 대한 : "와트 103RD 거리 리듬 밴드 ','너, 그거 ', 0": 출력 파일에 무엇을 쓸 것으로 예상합니까? – igorpcholkin

답변

0

항상 패턴이 'artist', 'song', plays 인 경우 작동하는 데 걸리는 소리는 (')(artist)(',)(song)(',)(plays)입니다. 그래서 정규식이 입력 주어진

scala> val extractionPattern = """(')(.*)(',\s+')(.*)(',\s+)(\d+)""".r 
extractionPattern: scala.util.matching.Regex = (')(.*)(',\s+')(.*)(',\s+)(\d+) 

과 같을 것이다, 그것은 당신에게 당신은 단지 2, 4, 6 일에 관심 6 경기를 줄 것이다.

scala> extractionPattern.findAllIn("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 100""") 
         .matchData.map(_.subgroups).toList 
res70: List[List[String]] = List(List(', WATTS 103RD STREET RHYTHM BAND, ', ', DO YOUR THING, "', ", 100)) 

그래서 당신이 걱정하는 사람을 처리

scala> extractionPattern.findAllIn("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 100""") 
         .matchData.map(_.subgroups) 
         .flatMap(matches => Seq(matches(1), matches(3), matches(5))).toList 
res71: List[String] = List(WATTS 103RD STREET RHYTHM BAND, DO YOUR THING, 100) 

뿐만 아니라 온라인 정규식 작업을 참조하십시오 - 당신은 CSV는 파일을 처리하는 것처럼 https://regex101.com/r/vcBJcI/1/

+0

정말 고마워요! 나는 개인 레코드가있는 정규식을 테스트 할 때만 문제가 있다는 것을 알았다. 올바른 결과물을 얻을 수있게 된 후에 내가 직면 한 실제 문제를 추가하는 것을 잊어 버렸습니다. – Darknorth

0

이 보인다? 그렇다면 https://github.com/tototoshi/scala-csv 또는 기존 라이브러리를 사용하는 것이 좋습니다.

당신은 그냥 재미를 원한다면, 내가 가입하고 다음과 같은 정규식 코드가 작동하는 것 같다 제공하는 것보다 다른 경우 확인하지 않고 있습니다 :

val input = """'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0""" 
val regex = """(?:')(.+?)(?:')|\d""".r 

regex.findAllIn(input).matchData.toList 

는 생산 (은? 비 캡처 그룹입니다) : 당신은 분명히 같은 출력 형식 (내 통신을보기 위해 튜플하고 사용자의 입력 데이터를 변환해야하는 이유

List('WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0) 

https://scalafiddle.io/sf/2fEtCsv/0

0

그것은 분명하지 않다 ent). 어쨌든 여기에 원하는 내용이 있습니다.

def matchData(s: String) = { 
    val pattern = """('[\w\s]+'),\s*('[\w\s]+'),\s*(\d)""".r 

    s match { 
     case pattern(artist, song, n) => Some(artist, song, n) 
     case _ => None 
    } 
    } 

    List("""'WATTS 103RD STREET RHYTHM BAND', 'DO YOUR THING', 0""") map matchData map { mayBeTuple => 
    mayBeTuple match { 
     case Some((artist, song, n)) => println(artist, song, n) 
     case _ => // ignore 
    } 
    } 
+0

정말 고마워요! 나는 개인 레코드가있는 정규식을 테스트 할 때만 문제가 있다는 것을 알았다. 올바른 결과물을 얻을 수있게 된 후에 내가 직면 한 실제 문제를 추가하는 것을 잊어 버렸습니다. – Darknorth