복붙노트

[SCALA] 정규식 사용주는 문자열에서 양을 얻을 [중복]

SCALA

정규식 사용주는 문자열에서 양을 얻을 [중복]

나는이 문자열을 가지고 그래서 :

val value = "\nValue is €2,927"

어떻게 내가 어떤 통화의이 금액 2927을, 구문 분석, 더블 /를 INT로 변환 할 수 있습니까?

이것은 내가하려고 한 것입니다 :

println(value.replaceAll("d{5}", ""))

편집하다:

€ 어떤 통화 표시 될 수 있습니다.

해결법

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

    1.이 질문에 확실한 대답하지 않을 수 있습니다 (I는 스칼라 코더 아니에요)하지만 난 다른 답변과 의견과 함께 유용 어쨌든이 될 것 같아요.

    이 질문에 확실한 대답하지 않을 수 있습니다 (I는 스칼라 코더 아니에요)하지만 난 다른 답변과 의견과 함께 유용 어쨌든이 될 것 같아요.

    당신은 저를 다른 숫자를 무시하고, 단지 통화 금액을 확인하는 정규식을 만드는 방법에 대해 생각했다. 이것은 내가 생각 해낸 것입니다 :

    ([$£€¥₹])?(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|(kr\.?|Kč))
    

    이 예제 핸들 금액은 달러 표지판에 고정 사전 $, GB는 £ 파운드, 유로 €, 일본 엔 (또는 중국의 위안 인민폐 (?)) ¥ 또는 인도 루피 ₹.

    또한 후 고정 통화 "기호"로 통화를 처리합니다. 예에서 스웨덴어 / 덴마크어 / 노르웨이어 크로네 (kr)를 체코 코 루나 Kč.

    양은 항상 2. 접두사 통화 기호가 1 군에 캡처 그룹에서 캡처 및 그룹 3에라는 접미어입니다 (나는 생각 - 당신이 통화를 모르는 경우 양이 무슨 소용입니다.)

    이 텍스트를 처리, regex101에 여기를 참조하십시오

    이 옵션 통화 기호를 일치시켜 시작한다. 그런 다음 ###, ##, ###, ##, ###, ###. ###의 같은 포맷 할 수있는 금액을 정합. 초기 통화 기호가 일치하는 경우, 그것은 아무것도 일치하지 않습니다 - - 그것은 정규식 조건을 사용 후> 다. 이 일치하지 않은 경우, 포스트 고정 통화 유형 테스트합니다.

    (여기에 엉덩이에서 촬영 - 어떤 일이든 어떤 스칼라 경험, 단지 "Google 직원") 코드 :

    val value = "\nValue is €2,927"
    val pattern = "([$£€¥₹])?(\\d{1,3}(?:[, ]?\\d{1,3})?(?:.\\d+)?)(?(1)|(kr\\.?|Kč))".r
    val pattern(c1, amnt, c2) = value
    // remove spaces and thousands-separators from the value
    val str = amnt.replaceAll("[ ,]", "")
    // convert it to an integer and/or double.
    val i = str.toInt
    val d = str.toDouble
    

    편집하다

    와! 이 힘들어이었다. 지금은 자바 정규식 경우 - 다른 구조를 지원하지 않는 것을 배웠다. 그래서 여기에 대한 대안은 조금 더 다른 복잡입니다 :

    (?=[$£€¥₹])(.)(\d{1,3}(?:,\d{3})?(?:\.\\d+)?)|(\d{1,3}(?:,\d{3})?(?:\.\d+)?)(kr\.?|Kč)
    

    그것은 미리 고정 또는 후 고정 통화 기호 있는지 결정하기 위해 긍정적 인 예견을 사용합니다. 실제 양은 사전 또는 사후에 따라 두 그룹으로 분할 될를 캡쳐했다. 하나는 2 통화 그룹 1과 양으로, 또는 제 3 양 통화 4 너무.

    그리고 기능 참조) 코드를 여기 ideone에서.

    편집 # 2

    일부 새로운 통화 및 물건 주석 이후에 추가.

    (Rs.|[$£€¥₹])?\s*(\d{1,3}(?:[, ]?\d{1,3})?(?:.\d+)?)(?(1)|\s*(kr\.?|Kč|INR|€))
    

    여기 regex101에서.

  2. ==============================

    2.당신은 여기 내 내 대답에서 유사한 솔루션을 가질 수있다. 그래서:

    당신은 여기 내 내 대답에서 유사한 솔루션을 가질 수있다. 그래서:

    scala> import scala.util.matching.Regex
    import scala.util.matching.Regex
    
    scala>  val matcher = new Regex("\\d{1,1}")
    matcher: scala.util.matching.Regex = \d{1,1}
    
    scala> val value = "\nValue is €2,927"
    value: String =
    "
    Value is €2,927"
    
    scala> matcher.findAllMatchIn(value).toList.mkString.toInt
    res1: Int = 2927
    

    편집 : 복식을 수용해야 ...

    scala> val value = "\nValue is €2,927.545"
    value: String =
    "
    Value is €2,927.545"
    
    scala>  val matcher = new Regex("\\d{1,3}[\\.\\,\\ ]?[0-9]$*")
    matcher: scala.util.matching.Regex = \d{1,3}[\.\,\ ]?[0-9]$*
    scala> matcher.findAllMatchIn(value).toList.mkString.replaceAll("[ ,]", "").toDouble
    res7: Double = 2927.545
    

    그리고 공간에 대한 ...

    scala> val value = "\nValue is €2 927, 927.545"
    value: String =
    "
    Value is €2 927, 927.545"
    
    scala> matcher.findAllMatchIn(value).toList.mkString.replaceAll("[ ,]", "").toDouble
    res8: Double = 2927927.545
    
  3. from https://stackoverflow.com/questions/37567406/get-amount-from-giver-string-using-regex by cc-by-sa and MIT license