2008-10-25 2 views
2

문자열은 특정 기호 (예 : ax, bx, dx, c, acc)와 숫자로 구성됩니다.Java : 문자열을 임의의 문자열로 대체하는 가장 쉬운 방법

예 : 도끼 5 5 DX 3 ACC C 도끼 BX

나는 하나 같은 세트의 또 다른 기호 기호 (무작위)을 모두 대체 할

. 즉 {ax, bx, dx, c, acc} 중 하나를 {ax, bx, dx, c, acc} 중 하나로 대체하십시오.

교체 예 : ACC 5 5 DX 3 ACC C 도끼 BX 또는 C 5 5 DX 3 ACC C 도끼 도끼

정규 표현식에 함께 할 수있는 방법이 있나요? Java? 그렇다면 어떤 방법을 사용해야합니까?

답변

1

나는이 세트가 그 상위 세트를 포함하는 문자열에서 특정 심볼 세트를 대체하는 가장 깨끗한 해결책이라고 생각합니다. appendreplacement가이 방법의 핵심입니다. 하나의 중요한주의 사항 : 요소 목록에 unescped 달러 문자 ($)를 포함하지 마십시오. "\ $"를 사용하여 이스케이프합니다.
.replaceall ("\ $", "\\ $"); 목록에 추가하기 전에 모든 문자열에 을 추가하십시오. javadoc 또한 $ 기호에 대해 의심의 여지가 있습니다.

import java.util.*; 
import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class ReplaceTokens { 
public static void main(String[] args) { 
    List<String> elements = Arrays.asList("ax", "bx", "dx", "c", "acc"); 
    final String patternStr = join(elements, "|"); //build string "ax|bx|dx|c|acc" 
    Pattern p = Pattern.compile(patternStr); 
    Matcher m = p.matcher("ax 5 5 dx 3 acc c ax bx"); 
    StringBuffer sb = new StringBuffer(); 
    Random rand = new Random(); 
    while (m.find()){ 
     String randomSymbol = elements.get(rand.nextInt(elements.size())); 
     m.appendReplacement(sb,randomSymbol); 
    } 
    m.appendTail(sb); 
    System.out.println(sb); 
} 

/** 
* this method is only needed to generate the string ax|bx|dx|c|acc in a clean way.... 
* @see org.apache.commons.lang.StringUtils.join for a more common alternative... 
*/ 
public static String join(List<String> s, String delimiter) { 
    if (s.isEmpty()) return ""; 
    Iterator<String> iter = s.iterator(); 
    StringBuffer buffer = new StringBuffer(iter.next()); 
    while (iter.hasNext()) buffer.append(delimiter).append(iter.next()); 
    return buffer.toString(); 
} 
1

첫 번째 질문에 대답하려면 다음과 같이하십시오.

무작위로 바꾸기 때문에 정규 표현식이 도움이되지 않습니다. 정규 표현식에 대해서는 아무 것도 무작위입니다. * 문자열은 배열에 있으므로 어떤 패턴 매칭으로도 문자열을 찾을 필요가 없으므로 다시 정규 표현식을 사용할 필요가 없습니다.

** 편집 : 질문이 편집되어 더 이상 문자열이 배열에 없다고 표시되지 않습니다. 이 경우 모두 하나의 큰 문자열로 가정하면 다른 답변에서와 같이 바꿀 부분을 찾기 위해 정규 표현식을 만들 수 있습니다. *

0

무작위 정수를 생성하려면 Random 클래스를 사용하십시오. 심볼의 인덱스.

String text = "ax 5 5 dx 3 acc c ax bx"; 
    System.out.println("Original: " + text); 
    String[] tokens = text.split(" "); 
    List<Integer> symbols = new ArrayList<Integer>(); 
    for(int i=0; i<tokens.length; i++) { 
     try { 
      Integer.parseInt(tokens[i]); 
     } catch (Exception e) { 
      symbols.add(i); 
     } 
    } 
    Random rand = new Random(); 
    // this is the part you can do multiple times 
    int source = symbols.get((rand.nextInt(symbols.size()))); 
    int target = symbols.get((rand.nextInt(symbols.size()))); 
    tokens[target] = tokens[source]; 

    String result = tokens[0]; 
    for(int i=1; i<tokens.length; i++) { 
     result = result + " " + tokens[i]; 
    } 
    System.out.println("Result: " + result); 

다시 함께 전에 join 토큰을 필요한만큼 교체합니다.

여기 두 부분이 까다로울 수 있습니다. 먼저, 정수가 아닌 토큰을 식별하기 위해 try catch를 시도하십시오. 나는 그 부분을 독자적인 방법으로 끌어내는 것이 좋습니다. 왜냐하면 그것은 작동하기 때문입니다,하지만 그것은 약간 해킹입니다.

두 번째 부분은 sourcetarget 개의 변수를 설정하는 부분입니다. 내가하고있는 일은 무작위로 선택된 색인을 숫자가 아닌 기호 중 하나로 가져 오는 것입니다. 두 개의 임의 인덱스가 있으면 다음 줄에서 인덱스를 바꿀 수 있습니다.

원래 String을 배열로 분할 한 후 무작위로 선택한 심볼에서 새 String을 작성하는 방법도 있습니다.

0
  1. 예, 정규식을 사용하여이 작업을 수행 할 수 있습니다. 아마도 매우 예쁘지 않겠지 만 루프 또는 2 개가 없음
  2. 예, 이것은 Java로 구현 될 수 있습니다.
  3. regex 패키지
  4. 구현은 학생을위한 연습 과제로 남겨 둡니다.
-1

감사합니다. 여기 내가 생각해내는 것이있다. 보다 효율적인 방법을 찾을 수 있는지 확인하십시오.

private final String[] symbolsPossible = {"ax","bx","cx","dx","foo"}; 
private boolean exists; 
private final String mutate(String s) 
{ 
String[] tokens=s.split(" "); 
for(int j=0; j<tokens.length; j++) 
if(Math.random()<.1) //10% chance of mutation per token 
{ 
//checking to see if the token is a supported symbol 
exists=false; 
for(int i=0; i<symbolsPossible.length; i++) 
    if(tokens[j].equals(symbolsPossible[i])) 
     exists=true; 
if(exists) 
    tokens[j]=symbolsPossible[(int)Math.random()*symbolsPossible.length]; 
} 
StringBuffer result=new StringBuffer(); 
for(String t:tokens) 
    result.append(t); 
return result; 
} 
관련 문제