私はこのような文字列を持っています。
myString = "Logged in as: MyUserName (Administrator)"
を除くすべての部品を取り外すにはどうすればよいMyUserName
ですか?
これまでのところ、(Administrator)
パーツを削除することしかできませんでした。
System.out.println(myString.replaceAll("\\([^()]*\\)", ""));
私は以下を使用します:
public static void main(String[] args) {
final String myString = "Logged in as: MyUserName (Administrator)";
final Pattern pattern = Pattern.compile("^[^:]++:\\s*+(\\S++).*+$");
final Matcher matcher = pattern.matcher(myString);
if(matcher.matches()) {
System.out.println(matcher.group(1));
}
}
出力
MyUserName
これは、一致が見つからない場合に高速な所有格マッチャーを使用します。
マッチンググループを使用することをお勧めします。「(」および「)」を使用して正規表現の一部を照合し、すべての文字列をグループのコンテンツに置き換えることができます。
次に例を示します。
String myString = "Logged in as: MyUserName (Administrator)";
System.out.println(myString.replaceAll("^[^:]*:\\s+([a-zA-Z]+)\\s.*$", "$1"));
出力:
MyUserName
正規表現
^[^:]*:\\s+([a-zA-Z]+)\\s.*$
ユーザー名と一致する一致するグループ([a-zA-Z] +)が含まれます。文字列全体の一部が、この最初に一致したグループのコンテンツ(この場合は$ 1)に置き換えられます。
文字列が常にで始まることが確実な場合はLogged in as:
、次のことを試すことができます。
String myString = "Logged in as: MyUserName (with parentheses) (Administrator)";
String login = myString.substring("Logged in as:".length(), myString.lastIndexOf('(')).trim();
これはMyUserName (with parentheses)
lastIndexOf
ユーザー名に括弧を含めることができないことが確実なindexOf
場合は、に置き換えることができます。
より単純なバージョンは次のようになります。
String myString = "Logged in as: MyUserName (with parentheses) (Administrator)";
String login = myString.substring(myString.indexOf(':'), myString.indexOf('(')).trim();
私はあなたの入力でこの正規表現をテストしました:
[^:]*:\s*([^(]*).*
またはJavaの場合:
Pattern p = Pattern.compile("[^:]*:\\s*([^(]*).*");
Matcher m = p.matcher("Logged in as: MyUserName (Administrator)");
if(m.find()) {
System.out.println(m.group(1));
}
ちなみに、RegexPlanetは正規表現を書くためのあなたの友達です:)
これは私のために働いた:myString.replaceAll(".+:(.+)\\(.+\\)", "$1")
最初のを含むすべての文字に一致します:
。それが見つかると、最初の文字が見つかるまで、次のすべての文字をキャプチャグループに書き込みます(
。次に、一致したすべてのコンテンツ(文字列全体である必要があります)を、セクションであるキャプチャグループのコンテンツに置き換えますMyUserName
。
別のバージョンはこれである可能性があります:セクションmyString.replaceAll(".+:\\s*(.+)\\s*\\(.+\\)", "$1")
から余分な空白文字を削除しますMyUserName
。
これを試して:
System.out.println(myString.replaceAll(".*?:\\s*(\\w+).*", "$1");
これは、最初のコロン、コロン自体、およびそれに続く空白までのすべてを無視し、ユーザー名をキャプチャして、それに続くすべてを無視します。次に、一致全体(つまり文字列全体)を最初にキャプチャされたグループ、つまりユーザー名に置き換えます。
パターン構文のドキュメントも参照してください:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
あなたはこれを試すことができます:
String myString = "Logged in as: MyUserName (Administrator)";
String myUserName = myString.replaceAll(".+:(.+)(\\(.+)", "$1").trim();
私の意見では、Patternオブジェクトを使用する必要があります。マッチャーを使用すると、パラメーターを抽出できます。このコードはあなたを助けることができます:
Pattern p = Pattern.compile("Logged in as: (.)+ (Administrator)", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(myString);
if (m.find()) {
return m.group(1);
}
else {
System.out.println("Not found !");
}
それが役立つことを願っています:)