我有一个这样的字符串;
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)。
你可以试试这个:
String myString = "Logged in as: MyUserName (Administrator)";
String myUserName = myString.replaceAll(".+:(.+)(\\(.+)", "$1").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
如果你确定字符串总是以 开头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();
尝试这个:
System.out.println(myString.replaceAll(".*?:\\s*(\\w+).*", "$1");
这会忽略第一个冒号之前的所有内容,冒号本身和它后面的任何空格,捕获用户名并忽略它后面的所有内容。然后它将整个匹配项(即整个字符串)替换为第一个捕获的组,即用户名。
另请参阅模式语法文档:http ://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
在我看来,您应该使用 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 !");
}
希望它会有所帮助:)