2012-07-28 49 views
7

因此,我對Regular Expressions完全陌生,我試圖使用Java的java.util.regex在輸入字符串中查找標點符號。 (1)!,?,...都是有效的工具,並且(2)「<」和「>」意味着某種特殊的東西,我不會知道提前標點符號的類型,並不算作標點符號。 程序本身是僞隨機構建短語的,我想在句子結束前去掉標點符號,然後再通過隨機過程。標點符號上的正則表達式

我可以將整個單詞與任何標點符號匹配,但匹配器只是給出了該單詞的索引。換句話說:

Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher([some input string]); 

會抓住任何帶有「!」的單詞,最後。 例如: - ! 「天」

String inputString = "It is a warm Summer day!"; 
Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher(inputString); 
String match = inputString.substring(m.start(), m.end()); 

結果>字符串匹配〜

但我希望Matcher索引只是「!」,所以我可以將其分開。

我可能會創建個案,並對每種標點符號使用String.substring(...),但我希望在使用正則表達式時可能會出現一些錯誤。

+0

哦表達!天哪,我甚至沒有注意到這一點。不,它根本不是故意的 - 感謝您提出它! – 2012-07-29 01:52:20

回答

6

我想嘗試類似的字符類正則表達式來

"[.!?\\-]" 

添加要匹配的[] S的內部的任何字符。注意轉義任何可能對正則表達式解析器有特殊含義的字符。

然後您必須通過使用Matcher.find()遍歷匹配,直到它返回false。

+1

提示:[here](http://www.regular-expressions.info/charclass.html)你可以看到*字符類中的特殊字符或元字符是右括號(]),反斜線(\),脫字號(^)和連字符( - )*。通常的元字符是字符類中的普通字符。所以''[\\。\\!\\?]「'和'」[。!?]相同''' – Pshemo 2012-07-28 22:29:49

+0

@Pshemo謝謝,我對此並不確定。當然,無論如何,逃避這些角色並不會傷害到它嗎? – 2012-07-28 22:31:06

+0

我希望它不會因爲我在我以前的項目中使用過逃逸標記:) – Pshemo 2012-07-28 22:34:01

18

Java以迂迴的方式支持POSIX字符類。對於標點符號,[:punct:]的Java等價物爲\ p {Punct}

詳情請參閱以下link

這裏是一個具體的,工作示例使用在評論

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

public class RegexFindPunctuation { 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile("\\p{Punct}"); 

     Matcher m = p.matcher("One day! when I was walking. I found your pants? just kidding..."); 
     int count = 0; 
     while (m.find()) { 
      count++; 
      System.out.println("\nMatch number: " + count); 
      System.out.println("start() : " + m.start()); 
      System.out.println("end() : " + m.end()); 
      System.out.println("group() : " + m.group()); 
     } 
    } 
} 
+3

使用'\ pP'好得多 – tchrist 2012-07-29 00:34:10

+0

我試着運行Pattern.compile(「\\ p {Punct}」)(在你提供的鏈接中提到的雙重轉義之後),但是它沒有找到任何標點符號。 具體而言,我運行了以下代碼: String input =「有一天!當我走路的時候。我找到你的褲子了? 「; Pattern p = Pattern.compile(」\\ p {Punct}「); Matcher m = p.matcher(input); – 2012-07-29 01:51:26

+2

與上面相同,使用Matcher.find() 。注意,這對於返回所有匹配的(內存)性能要好得多。如果你只想匹配整個字符串,那麼順便說一句,你可以寫'.input'.matches(「pattern」)。 – 2012-07-29 09:19:50

相關問題