0

我有一个这样的字符串;

myString = "Logged in as: MyUserName (Administrator)"

如何删除除 之外的所有部分MyUserName

到目前为止,我只设法删除了该(Administrator)部分。

System.out.println(myString.replaceAll("\\([^()]*\\)", ""));
4

8 回答 8

2

我会使用以下内容:

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

这使用了所有匹配器,当没有找到匹配时会更快

于 2013-03-14T14:23:24.357 回答
2

我建议使用匹配组。您可以使用“(”和“)”来匹配您正则表达式的一部分,然后将所有字符串替换为组的内容。

这是一个例子:

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)。

于 2013-03-14T14:04:18.117 回答
1

你可以试试这个:

String myString = "Logged in as: MyUserName (Administrator)";
String myUserName = myString.replaceAll(".+:(.+)(\\(.+)", "$1").trim();
于 2013-03-14T14:15:54.850 回答
1

我已经用你的输入测试了这个正则表达式:

[^:]*:\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是您编写正则表达式的朋友 :)

于 2013-03-14T14:03:31.477 回答
1

这对我有用:myString.replaceAll(".+:(.+)\\(.+\\)", "$1")

它将匹配直到并包括第一个的所有字符:。一旦找到,它将所有下一个字符写入捕获组,直到找到第一个(。然后它将所有匹配的内容(应该是整个字符串)替换为捕获组的内容,即该MyUserName部分。

另一个版本可能是这样的:它将从该部分myString.replaceAll(".+:\\s*(.+)\\s*\\(.+\\)", "$1")中删除任何额外的空白字符。MyUserName

于 2013-03-14T14:05:12.690 回答
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();
于 2013-03-14T14:02:43.287 回答
1

尝试这个:

System.out.println(myString.replaceAll(".*?:\\s*(\\w+).*", "$1");

这会忽略第一个冒号之前的所有内容,冒号本身和它后面的任何空格,捕获用户名并忽略它后面的所有内容。然后它将整个匹配项(即整个字符串)替换为第一个捕获的组,即用户名。

另请参阅模式语法文档:http ://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

于 2013-03-14T14:07:22.987 回答
-1

在我看来,您应该使用 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 !");
}

希望它会有所帮助:)

于 2013-03-14T14:06:08.937 回答