2009-12-18 88 views
3

如何匹配以下順序:相似但不相同的字符串序列

You wound DUMMY TARGET for 100 points of damage 

但不是:

You wound DUMMY TARGET with SKILL for 100 points of damage 

正則表達式:

^You wound ([\\w\\s]+)(?!with) for (\\d+) points of damage 

正則表達式以上匹配兩個字符串,而我希望只匹配第一個。有什麼辦法可以做到這一點?

樣品Java代碼:

import java.util.regex.*; 

public class Dummy { 

static Pattern pattern = Pattern.compile("^You wound ([\\w\\s]+)(?!with) for (\\d+) points of damage"); 
static Matcher matcher = pattern.matcher(""); 
static String FIRST_SEQUENCE = "You wound DUMMY TARGET for 100 points of damage"; 
static String SECOND_SEQUENCE = "You wound DUMMY TARGET with SKILL for 100 points of damage"; 

public static void main(String...args) { 
    if (matcher.reset(FIRST_SEQUENCE).matches()) 
    System.out.println("First match. Ok!"); 

    if (matcher.reset(SECOND_SEQUENCE).matches()) 
    System.out.println("Second match. Wrong!"); 
} 
} 
+0

」with SKILL「總是固定的? – YOU 2009-12-18 14:51:32

+0

單詞「with」始終是固定的。技能可以是一個或多個間隔的單詞。 這些是真正的序列示例: 「你傷害了Ongbúrz狂戰士68點古代矮人造成的傷害。」 「你用Valar的Anthem傷害了Ongbúrz狂戰士,造成了215點古代矮人造成的傷害。」 – 2009-12-18 17:34:03

回答

3

嘗試用非貪婪操作符+? ,([\\w\\s]+?)

^You wound ([\\w\\s]+?)(?!with) for (\\d+) points of damage 
+0

謝謝,但沒有奏效。 – 2009-12-18 14:48:42

+1

我認爲你需要2個正則表達式並且像這樣匹配第二個'''你傷害(\\ w \\ s)+?)(\\ d +)點傷害「,並且if它的匹配,跳過它,否則,與'^你傷害([\\ w \\ s] +?)與(\\ d +)點傷害相匹配 – YOU 2009-12-18 14:58:34

+0

該解決方案將使用條件正常工作。但我正在尋找一種方法將其與正則表達式匹配。 – 2009-12-18 17:37:16

0

而且,如果要匹配的字符串總是大寫,你可以嘗試:

^You wound ([A-Z\s]+) for (\d+) points of damage 
+0

序列可以是「某些人」到「兄弟」或「某人」的任何內容。 – 2009-12-18 14:50:00

0

試試這個:

「^你傷口[A-ZA-Z0 -9] [^ with] + for [0-9] +點傷害「

爲我工作

相關問題