2014-07-17 2 views
2

I가 다음 문자열 :루비 정규식 반환 배열에만

1: "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA" 

2: "AMETHYST 9x10 OVAL CHECKERBOARD AAA" 

3: "AMETHYST 9-10 OVAL CHECKERBOARD AAA" 

4: "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA" 

5: "AMETHYST 9.5 OVAL CHECKERBOARD AAA" 

6: "AMETHYST 9 OVAL CHECKERBOARD AAA" 

내가 정수의 배열을 반환 내 정규식을 좋아하거나 첫 번째 경우 복용 예를 들어 수레 할 경우 당 :

[ 
    [0] "9.5" 
    [1] "10.5" 
] 

많은 Rubular 나에 노력 후에 나는 함께했다 :

/\d+[.]\d+?/ 

이 나에게주는 경기 resu의 대부분 Rubular.com을 확인할 때 필요합니다. 그러나 2, 3, 6의 경우에는 - 또는 x 문자 앞의 정수에서 픽업되지 않으며 int가 case 6과 같이 혼자있는 경우도 발생하지 않습니다.

무엇이 누락 되었습니까?

고맙습니다!

+1

는 접두사 "1 :, 2 :, 3 :"데이터에 ? 또는 라인에 라벨을 붙이기 위해? –

+0

** 누구나 참고 **. 질문은 : "** 나는 무엇을 놓치고 있습니까? **"지금까지는 Nishu와 나의 대답 만이이 질문에 답합니다. – sawa

+2

이것은 위험하지 않습니다. 원하는 답을 문구로 구사할 수 있습니다. 정규 표현식이나 다른 대안으로 자신의 문제를 해결하는 작업 예제는 여전히 유용한 답변입니다. 게다가 "나는 무엇을 놓치고 있습니까?" 특정 표현이 아니라 표현식입니다. –

답변

5

이 그것을 수행해야합니다

def doit(str) 
    str.scan(/\d+\.?\d*/) 
end 

doit "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA" #=> ["9.5", "10.5"] 
doit "AMETHYST 9x10 OVAL CHECKERBOARD AAA"  #=> ["9", "10"] 
doit "AMETHYST 9-10 OVAL CHECKERBOARD AAA"  #=> ["9", "10"] 
doit "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA" #=> ["9.5", "10.5"] 
doit "AMETHYST 9.5 OVAL CHECKERBOARD AAA"  #=> ["9.5"] 
doit "AMETHYST 9 OVAL CHECKERBOARD AAA"  #=> ["9"] 
+0

'# scan' - 그게 전부입니다. 논증 없음. –

+1

@Arup, 실제로 인수가 필요합니다. :-) –

4

마침표 문자는 선택 사항입니다. 이는 한정자 ?을 사용하여 수행 할 수 있습니다.

그런데 왜 소수 자릿수를 욕심이 없게해야하는지 명확하지 않습니다. 소수점 이하 한 자리 만 원한다고 설명하지 않았습니다. 또한이 경우 \d+?에서와 같이 한정자 +과 함께 사용하는 것은 의미가 없습니다. \d과 같은 효과가 있습니다.

는이 같은 정규식을 가질 수있다, 그것이 작동되도록하려면 다음과 같이 간단하게

\d+(?:[.]\d+)? 

: 이것은 사용자가 제공 한 examles에 대한 Rubular 나 작동

/\d+\.?\d*/ 

또는

/\d+(?:\.\d+)?/ 
+0

OP가 하나 이상의 숫자로 시작하는 모든 문자열을 추출하려고했으며 가능한 한 최대 다음에 하나의 마침표가 올 수 있고 마침표가 있으면 하나 이상의 추가 자릿수가 이어져야한다고 가정합니다. 어떤 정규식을 사용 하시겠습니까? –

+0

@CarySwoveland 제 두 번째 정규식이 그렇게 할 것입니다. – sawa

+0

두 번째 정규식은 "AMETHYST 9.5x10. OVAL"에 대해 [ "9.5", "10"]을 반환합니다. 내가 의미했던 것은 정규 표현식이 그 문자열에 대해 [9.5 "]'를 반환 할 것이다. '10.'다음에 숫자가 없으므로 '10.'을 무시합니다. 그냥 궁금해서. –

0

마지막 부분에 캡처하지 않은 그룹을두고 마지막 부분을 배치 했습니까? 외부에서는 게으른 한정 기호 대신 0 또는 1을 사용합니다.

2

는 정규식에없는 2 가지가 있습니다.

첫 번째 :? 문자를 사용하여 도트 문자를 선택 사항으로 만드십시오. 그 다음. 둘째, 나는 그 그것을 위해 만든 무슨 이후, scan를 사용하고 결과에 조금의 마사지 것입니다 귀하의 예를 들어 입력이 정확 가정 *

\d+[.]?\d* 
+0

'[.]'을 사용하는 것은'.'을 벗어나는 먼 길입니다. 대신'\ .'을 사용하십시오. –

+1

동의. 질문 자체에서 국제 대회 계속. – Nishu

2

을 추가하여 선택 및 동적 길이 점 다음 값을 확인 ..

strings = [ 
    '1: "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA"', 
    '2: "AMETHYST 9x10 OVAL CHECKERBOARD AAA"', 
    '3: "AMETHYST 9-10 OVAL CHECKERBOARD AAA"', 
    '4: "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA"', 
    '5: "AMETHYST 9.5 OVAL CHECKERBOARD AAA"', 
    '6: "AMETHYST 9 OVAL CHECKERBOARD AAA"', 
] 

strings.map{ |s| s.scan(/\d+[.\d]*/)[1..-1] } 
# => [["9.5", "10.5"], 
#  ["9", "10"], 
#  ["9", "10"], 
#  ["9.5", "10.5"], 
#  ["9.5"], 
#  ["9"]] 

/\d+[.\d]*/ 하나 개 이상의 숫자, 선택적으로 '.'와 숫자의 수에 따라 즉, 선도 1: 일치하지만, 배열을 공격 태도를 보여준 것은 그 숫자 경우 스트립 것 찾기 "를 의미만을 원하는 값을 반환처럼 존재 함패턴은 1.0.0.0을 반환 할 것이지만이 패턴은 꽤 무의미한 값이므로이 패턴은 상당히 안전하다고 생각합니다.예 입력이 정확하지 않고, 줄 번호 정말로 다음 존재하지 않은 경우

그것은 더 간단하게 :

strings = [ 
    '"AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA"', 
    '"AMETHYST 9x10 OVAL CHECKERBOARD AAA"', 
    '"AMETHYST 9-10 OVAL CHECKERBOARD AAA"', 
    '"AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA"', 
    '"AMETHYST 9.5 OVAL CHECKERBOARD AAA"', 
    '"AMETHYST 9 OVAL CHECKERBOARD AAA"', 
] 

strings.map{ |s| s.scan(/\d+[.\d]*/) } 
# => [["9.5", "10.5"], 
#  ["9", "10"], 
#  ["9", "10"], 
#  ["9.5", "10.5"], 
#  ["9.5"], 
#  ["9"]]