2016-11-15 1 views
1

다음과 같은 사용자 입력이 발생합니다.로마 숫자 대체 문자열

"ix는 모두 viii가 로마 숫자입니다. mcmlxxxvii는 와우 년입니다. 년은 mmxvi입니다."

i/p에있는 모든 로마 숫자를 검색하고 대문자로 변환해야합니다. 그래서 xxx는 로마 숫자를 찾을 수 아래처럼 문자열 교체를 사용하고 싶습니다.

input.replaceAll("(?i)xxx","XXX"); 

현재 입력이 있는지 여부를 확인할 수 있습니다.

System.out.println(input.matches("^.*M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}).*$")); 

도와주세요.

(?!\bi+\b)\b[dcmlxvi]+\b|(\bi+\.) 

을하고 이것에 의해 대체 :

+0

는 사용하지 마십시오 앵커 ('^' 와'$')를 사용하여 텍스트 부분을 일치 시키려면 – Aaron

+0

'replaceAll'은'appendReplacement'를 찾는데 도움이되지 않습니다. –

+0

@ WiktorStribiżew 감사하지만 적절한 정규식이 필요합니다. –

답변

0

이 시도

\U\1 will not work in java though,but the following code will 

Explanation

자바 코드 샘플 :

final String regex = "(?!\\bi+\\b)\\b[dcmlxvi]+\\b|(\\bi+\\.)"; 
String string = "i i Both ix is viii are roman numeral. mcmlxxxvii is wow year. Year is mmxvi. i i I i i i i am good"; 
String tmp; 
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); 
final Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    tmp=matcher.group(0).toUpperCase(); 
    string=string.replace(matcher.group(0),tmp); 
} 

System.out.println(string); 
+0

입력이 "i와 같은 로마자로 시작하면 실패합니다. ix는 모두 viii가 로마 숫자이며, mcmlxxxvii는 와우 년입니다. 년은 mmxvi입니다." 나는 또한 다음과 같은 결과를 얻고있다. "\\ b (M {0,4} (CM | CD | D? C {0,3}) (XC | XL | L? X {0,3}) (IX | IV | V · I (0,3})) \\ b ". –

+0

싱글 'i'가 개별적으로 당신의 문제입니까? 그것은 단어 일 수 있고 또한 로마 숫자가 될 수 있기 때문에 ... 그래서 당신은 하나의 단어를 상위에두기를 원하지 않습니까? –

+0

대문자로되어 있지 않은 업데이트 된 답변보기 i –

관련 문제