5

この種の質問が非常に頻繁に提案されることは知っていますが、この正規表現が一致しない理由がわかりません。行頭に「M」があるかどうかを確認したい。最後に、行末にパスが必要です。これが、startsWith() が私のニーズに合わない理由です。

line = "M            72208    70779 koj          src\com\company\testproject\TestDomainf1.java";

if (line.matches("^(M?)(.*)$")) {}

私は別の方法も試しました:

Pattern p = Pattern.compile("(M?)");
Matcher m = datePatt.matcher(line);
if (m.matches()) {
    System.out.println("yay!");
}

if (line.matches("(M?)(.*)")) {}

ありがとう

4

6 に答える 6

5

正しい正規表現は単純です

line.matches("M.*")

メソッドは、matches入力シーケンス全体が一致する必要があるためです。ただし、これは非常に単純な問題であるため、正規表現が本当に必要かどうか疑問に思います。平野

line.startsWith("M")

また

line.length() > 0 && line.charAt(0) == 'M'

または単に

line.indexOf('M') == 0 

あなたの要件のために動作します。

パフォーマンス?

パフォーマンスにも関心がある場合は、2 番目と 3 番目のオプションが優先されますが、最初のオプションは簡単に最も遅いオプションになる可能性があります。最初に正規表現をコンパイルしてから評価する必要があります。indexOf最悪の場合、文字列全体をスキャンするという問題があります。

アップデート

それまでの間、質問を完全に言い直して、正規表現が本当に必要なものであることを明確にしました。この場合、以下が機能するはずです。

Matcher m = Pattern.compile("M.*?(\\S+)").matcher(input);
System.out.println(m.matches()? m.group(1) : "no match");

これは、パスにスペースが含まれていない場合にのみ機能することに注意してください。もしそうなら、問題ははるかに難しいです。

于 2013-08-19T13:03:38.790 に答える
3

このパターンを使用してM、文字が文字列の先頭にあるかどうかを確認できます。

if (line.matches("M.*"))

しかし、これほど単純なものでは、これを使用できます。

if (line.length() > 0 && line.charAt(0) == 'M')
于 2013-08-19T13:03:04.300 に答える
3

そのための正規表現は必要ありません。使うだけString#startsWith(String)

if (line.startsWith("M")) {
    // code here
}

またはそれ以外の場合String#toCharArray():

if (line.length() > 0 && line.toCharArray()[0] == 'M') {
    // code here
}

編集:入力文字列からパスを取得するための編集済みの要件の後。

正規表現を回避して、コードを次のようにすることもできます。

String path="";
if (line.startsWith("M"))
    path = line.substring(line.lastIndexOf(' ')+1);
System.out.println(path);

出力:

src\com\company\testproject\TestDomainf1.java
于 2013-08-19T13:03:41.157 に答える
0

なぜこれをしないのですか

line.startsWith("M");
于 2013-08-19T13:03:33.133 に答える
0

パスが必要な場合は、文字列を分割し\tて(区切り文字だと思います)、最新のフィールドを取得できます。

String[] tabS = "M            72208    70779 kij          src\com\knapp\testproject\TestDomainf1.java".split("\t");
String path = tabS[tabS.length-1];
于 2013-08-19T13:55:38.283 に答える