2012-09-14 25 views
2

我想要一個邏輯(可能是regexp),通過它我可以從下面的語句中提取方法鍵和參數。從字符串中提取方法鍵/參數

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() 

我試着用大括號和空格一些簡單的字符串分割,但不能夠以期望的結果到達。我該怎麼辦?

+0

在哪種語言,你需要嗎? –

+0

在java編程語言.. –

回答

1

使用replaceAll()與你輸入相應的參數:

input.replaceAll(".*(?<=^|\\s)(\\w+\\(.*?\\)).*", "$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() 

看起來很像你的樣本數據:)

+0

嗨波西米亞,因爲它是緊迫感,我反正做了一些拆分,替換和正則表達式相同。但我認爲你的解決方案更簡單和優雅。謝謝。 –

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(); 
} 
+0

我的要求是提取所需的字符串.. –