문자열을 인용 부호와 인용 부호가없는 부분으로 나누고 싶습니다. 여기서 이스케이프 된 인용 부호는 무시됩니다. 예를 들어, 다음 입력 :
String input = "Example with \"quoted \\\"test\\\" region\" embedded";
다음 목록이 표시되어야합니다.
String[] result = ["Example with", "\"quoted \\\"test\\\" region\"", "embedded"];
인용 영역을 분할하려면 (이스케이프 인용 부호를 무시하면서) 다음을 사용합니다.
public static final String QUOTE_PATTERN = "(?<!\\\\)\".*?(?<!\\\\)\"";
String input = "Example with \"quoted \\\"test\\\" region\" embedded";
String[] result = input.split(QUOTE_PATTERN);
System.out.println(Arrays.toString(result));
예상되는 출력을 제공합니다 [Example with , embedded]
. 그러나이 목록에 구분 기호 (인용 된 영역)도 포함하고 싶습니다. (물론, Matcher를 사용하여 시작 중지 인덱스를 가져옴으로써이를 달성 할 수 있지만 여전히 많은 추가 코드가 필요합니다.)
콜론으로 구분 된 문자열을 콜론이 포함 된 목록으로 성공적으로 분할 할 수있는 lookahead 및 lookbehind를 사용하여 구분 기호를 포함하는 문자열을 분할하는 솔루션을 찾았습니다.
public static final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static final String COLON_PATTERN = String.format(WITH_DELIMITER, ":");
String colonTest = "Part0:Part1:Part2";
String[] parts = colonTest.split(COLON_PATTERN);
System.out.println(Arrays.toString(parts));
그러면 다음과 같은 출력이 제공 [Part0, :, Part1, :, Part2]
됩니다..
그러나 다음과 같은 이유로 가변 길이를 가진 구분 기호에는 적용 할 수없는 것 같습니다.
public static final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static final String QUOTE_PATTERN =
String.format(WITH_DELIMITER, "(?<!\\\\)\".*?(?<!\\\\)\"");
String input = "Example with \"quoted \\\"test\\\" region\" embedded";
String[] result = input.split(QUOTE_PATTERN);
System.out.println(Arrays.toString(result));
다음 오류가 발생합니다.
Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 23
((?<=(?<!\\)".*?(?<!\\)")|(?=(?<!\\)".*?(?<!\\)"))
^
가변 너비 구분 기호에 비슷한 것이 가능한지 아는 사람이 있습니까?
감사!
문자열의 길이가 200 개 이하이기 때문에 Java 제한 너비 look-behind를 사용할 수 있습니다 . 즉, Java의 look-behind는 {0,200}
수량자를 지원 합니다 (최소 및 최대 길이가 지정됨).
✽ Java는 일치하는 문자열의 길이가 미리 정의 된 범위 내에있는 한 lookbehind 내에서 수량자를 허용합니다. 예를 들어
(?<=cats?)
는 3 자 또는 4 자의 문자열과 만 일치 할 수 있기 때문에 유효합니다. 마찬가지로(?<=A{1,10})
유효합니다.
따라서 다음 코드를 활용할 수 있습니다.
String.format(WITH_DELIMITER, "(?<!\\\\)\".{0,200}(?<!\\\\)\"");
^^^^^^^
IDEONE 데모 보기
String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
String QUOTE_PATTERN =
String.format(WITH_DELIMITER, "(?<!\\\\)\".{0,200}(?<!\\\\)\"");
String input = "Example with \"quoted \\\"test\\\" region\" embedded";
String[] result = input.split(QUOTE_PATTERN);
System.out.println(Arrays.toString(result));
산출:
[Example with , "quoted \"test\" region", embedded]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다