Разбор строк с регулярными выражениями - PullRequest
0 голосов
/ 11 мая 2010

У меня есть следующая строка, которую я хотел бы проанализировать в List или String [].

(Test)(Testing (Value))

Конечный результат должен быть Test и Testing (Value)

Ответы [ 4 ]

2 голосов
/ 11 мая 2010

Если я правильно понял, что вам нужно Test и Testing (Value), то вот регулярное выражение:

\(([^\)]+)\)\((.+)\)

и его версия в маске, готовая для Java-строки:

\\(([^\\)]+)\\)\\((.+)\\)
0 голосов
/ 27 февраля 2016
/**
 * Parse string:
 *              when '$' symbol is encountered it deletes it's previous character and the '$' symbol itself
 *              when '@' symbol is encountered it erases the text previous to it and the '@' symbol itself 
 * @author Rama Bolishetty
 * @date Feb 27, 2016
 */
package com.ram.utilities;

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

public class ParseString {
    private static final Pattern dollarSymborPattern = Pattern.compile("[a-zA-Z0-9]{0,1}[$]{1}");
    private static final Pattern atSymbolPattern = Pattern.compile("[a-zA-Z0-9$]{0,}[@]{1}");

    public static String parseString(String inputString) {
        String parsedString = inputString;
        Matcher m = atSymbolPattern.matcher(parsedString);
        String matcher = replaceMatcher(m);
        parsedString = matcher != null ? matcher : parsedString;
        m = dollarSymborPattern.matcher(parsedString);
        parsedString = replaceMatcher(m);
        parsedString = matcher != null ? matcher : parsedString;
        return parsedString;
    }

    private static String replaceMatcher(Matcher m) {
        if (m.find()) {
            return m.replaceAll("");
        }
        return null;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String inputString = scanner.nextLine();
        long sTime, eTime;
        System.out.println("STime:" + (sTime = System.currentTimeMillis()) + "\nParsed String:"
                + ParseString.parseString(inputString) + "ETime:" + (eTime = System.currentTimeMillis()));
        System.out.println("Total milliseconds:" + (eTime - sTime));
        scanner.close();
    }
}
0 голосов
/ 12 мая 2010

Этот вопрос действительно расплывчатый, но при одной разумной интерпретации это решение, которое может позаботиться о произвольной глубине вложения в определенном формате:

    String text = "(T)(T(V))(1(2(3)2)1)(a*(b+(c-d))+(e/f))";
    String[] parts = text.split("(?<=\\))(?=\\()");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[(T), (T(V)), (1(2(3)2)1), (a*(b+(c-d))+(e/f))]"

В основном вы хотите split между )( (используя утверждения). Не будет работать во всех случаях, например ((.)(.)), но, как говорили многие люди, требования этого вопроса расплывчаты, а проблема с общими сбалансированными скобками не разрешима с помощью регулярного выражения Java.

Смотри также

0 голосов
/ 11 мая 2010

Пожалуйста, прочитайте этот раздел руководства по php. В нем рассказывается о рекурсивных шаблонах, которые можно использовать для сопоставления вложенных объектов, и о связанных проблемах. Google это для получения дополнительной информации.

...