2017-12-26 2 views
1

따옴표로 묶은 부분 문자열 인 "/\"(?:[^\"\\]|\\.)*\"/" (원래는 /"(?:[^"\\]|\\.)*"/, Here 참조)과 일치하는 정규 표현식이 있습니다. regex101에서 테스트 한 결과 작동합니다. 방법 공동가 올바른 있습니까Haskell, regex, TDFA : 따옴표로 묶은 부분 문자열

*** Exception: Explict error in module Text.Regex.TDFA.String : Text.Regex.TDFA.String died: 
parseRegex for Text.Regex.TDFA.String failed:"/"(?:[^"\]|\.)*"/" (line 1, column 4): 
unexpected "?" 
expecting empty() or anchor^or $ or an atom 

: TDFA

, 그것은 구문입니까?

테스트 문자열 : Is big "problem", no?

예상 결과 : "problem"

UPD :

removeQuotedSubstrings :: String -> [String] 
removeQuotedSubstrings str = 
    let quoteds = concat (str =~ ("/\"(?:[^\"\\]|\\.)*\"/" :: String) :: [[String]]) 
    in quoteds 
+0

잘못된 정규 표현식을 사용하려고 생각합니다. AFAIR Posix ERE는'? :'를 지원하지 않습니다. 또한 실제 하스켈 구문을 보여주십시오. '\\.'는 하스켈의 백 슬래시 - 마침표로, RE 리터럴 - 마침표입니다. '/.../ '구분 기호는 무엇입니까? 그들은 정규식 구문의 일부가 아닙니다. –

+0

슬래시를 제거하려고했으나 아무런 차이가 없었습니다. '? :'의 대용 물이 있습니까? 'TDFA'는 내 프로그램의 다른 곳에서 사용됩니다. UPD를 참조하십시오. –

+0

시행 착오는 정규 표현식을 작동시키는 데 특히 유용한 방법이라고 생각하지 않습니다. 모든 단일 문자가 무엇을하고 있는지 정확하게 알고있는 것이 좋습니다. 백 슬래시를 제거 하시겠습니까? 왜 일부를 추가하지 않으시겠습니까? 이 응용 프로그램에서는 평범한 이전 캡처 그룹이 작업을 수행해야하므로 캡처하지 않는 그룹을 사용할 필요가 없습니다. –

답변

0

없음 개선, 그냥 허용 솔루션, 우아함이 부족이기는 :

이 전체 맥락이다 :

import qualified Data.Text as T 
import Text.Regex.TDFA 

-- | Removes all double quoted substrings, if any, from a string. 
-- 
-- Examples: 
-- 
-- >>> removeQuotedSubstrings "alfa" 
-- "alfa" 
-- >>> removeQuotedSubstrings "ngoro\"dup\"lai \"ming\"" 
-- "ngoro lai " 
removeQuotedSubstrings :: String -> String 
removeQuotedSubstrings str = 
    let quoteds = filter (('"' ==) . head) 
       $ concat (str =~ ("\"(\\.|[^\"\\])*\"" :: String) :: [[String]]) 
    in T.unpack $ foldr (\quoted acc -> T.replace (T.pack quoted) " " acc) 
         (T.pack str) quoteds 

예, 최종 목적은 항상 입니다. 따옴표로 묶은 부분 문자열을 제거하십시오.

관련 문제