2

以下のタイプのステートメントからメソッドキーとパラメーターを抽出できるロジック(おそらく正規表現)が必要です。

RuleResult executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

RuleResult executeRule() { /* some key */ }
// result: executeRule()

executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

executeRule() { /* some key */ }
// result: executeRule()

static executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

static executeRule() { /* some key */ }
// result: executeRule()

波括弧と空白を使用して単純な文字列分割を試みましたが、目的の結果に到達できませんでした。私は何をすべきか?

4

2 に答える 2

1

入力の適切なパラメータで使用replaceAll()します。

input.replaceAll(".*(?<=^|\\s)(\\w+\\(.*?\\)).*", "$1");

この正規表現は、グループ1で(「後ろを振り返る」を使用して)保持したいものと一致しますが、入力全体を一致させ、それをグループ1に置き換えます。これにより、保持したいものを置き換えるのではなく、保持します。

すべてのサンプルを含むテストコードを次に示します。

public static void main(String[] args) throws Exception {
    String[] examples = { 
            "RuleResult executeRule(RuleData, RuleProperties, Locale) { /* some key */ }", 
            "RuleResult executeRule() { /* some key */ }",
            "executeRule(RuleData, RuleProperties, Locale) { /* some key */ }", 
            "executeRule() { /* some key */ }",
            "static executeRule(RuleData, RuleProperties, Locale) { /* some key */ }", 
            "static executeRule() { /* some key */ }" };
    for (String example : examples) {
        System.out.println(example + "\n// result: " + 
            example.replaceAll(".*(?<=^|\\s)(\\w+\\(.*?\\)).*", "$1") + "\n");
    }
}

出力:

RuleResult executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

RuleResult executeRule() { /* some key */ }
// result: executeRule()

executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

executeRule() { /* some key */ }
// result: executeRule()

static executeRule(RuleData, RuleProperties, Locale) { /* some key */ }
// result: executeRule(RuleData, RuleProperties, Locale)

static executeRule() { /* some key */ }
// result: executeRule()

サンプルデータによく似ています:)

于 2012-09-14T12:11:00.753 に答える
0

これは、何かを分割するのではなく、一致させたいように見えます。

\w+\([^()]*\)

すべての例で必要な文字列と一致します。

説明:

\w+    # Match an alphanumeric "word"
\(     # Match an opening paren
[^()]* # Match any number of characters except parens
\)     # Match a closing paren

Java の場合:

Pattern regex = Pattern.compile("\\w+\\([^()]*\\)");
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group();
} 
于 2012-09-14T09:40:57.977 に答える