如何编写正则表达式以删除字符串开头和字符串结尾的部分,并将部分保存在中间

时间:2013-03-14 13:57:41

标签: java regex

我有这样的字符串;

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

如何删除MyUserName以外的所有部分?

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

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

8 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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

这使用了faster when no match is found的正面匹配器。

答案 2 :(得分: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();

答案 3 :(得分: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是你写regexes的朋友:)

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

试试这个:

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

这会忽略第一个冒号,冒号本身及其后面的任何空格的所有内容,捕获用户名并忽略其后的所有内容。然后它用第一个捕获的组替换整个匹配(即整个String),即用户名。

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

答案 6 :(得分:1)

你可以试试这个:

String myString = "Logged in as: MyUserName (Administrator)";
String myUserName = myString.replaceAll(".+:(.+)(\\(.+)", "$1").trim();

答案 7 :(得分:-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 !");
}

希望它会有所帮助:)