Java 是否使用正则表达式从字符串中删除可能的序列?

Java 是否使用正则表达式从字符串中删除可能的序列?,java,regex,Java,Regex,我有一个字符串列表,其中一些(不是全部)有如下结尾: "StringSignOut" "String Sign Out" "String SIGNOUT" "StringSO" "String SO" "String S.O." "StringS.O." 我想摆脱所有的注销和SOs,我只是不知道如何做的模式 private static String getGroup(String s, String pat, int g) { Pattern p = Pattern.

我有一个字符串列表,其中一些(不是全部)有如下结尾:

"StringSignOut"
"String Sign Out"
"String SIGNOUT"
"StringSO"
"String SO"
"String S.O."
"StringS.O."
我想摆脱所有的注销和SOs,我只是不知道如何做的模式

    private static String getGroup(String s, String pat, int g) {
        Pattern p = Pattern.compile(pat);
        Matcher m = p.matcher(s);
        if (m.matches()) {
            return m.toMatchResult().group(g);
        } else {
            return null;
        }
    }

您可以使用带有多个选择的正则表达式从字符串中删除
SO/signout

示例:

 String [] s = {    "StringSignOut",
                         "String Sign Out",
                         "String SIGNOUT",
                         "StringSO",
                         "String SO",
                         "String S.O.",
                         "StringS.O."};
     for(String s2 : s)
     {
         System.out.println(s2.replaceAll("SignOut| Sign Out| SIGNOUT|SO| SO| S.O.|S.O.", ""));
     }
String
String
String
String
String
String
String
String
String
String
String
String
String
String
结果:

 String [] s = {    "StringSignOut",
                         "String Sign Out",
                         "String SIGNOUT",
                         "StringSO",
                         "String SO",
                         "String S.O.",
                         "StringS.O."};
     for(String s2 : s)
     {
         System.out.println(s2.replaceAll("SignOut| Sign Out| SIGNOUT|SO| SO| S.O.|S.O.", ""));
     }
String
String
String
String
String
String
String
String
String
String
String
String
String
String

您可以使用下面的代码

String [] s = {    "StringSignOut",
             "String Sign Out",
             "String SIGNOUT",
             "StringSO",
             "String SO",
             "String S.O.",
             "StringS.O."};
   for(String s2 : s)
     {
    System.out.println(s2.replaceAll("(?i)\\s*(?:sign\\s*out|s\\W*o\\W*)", ""));
    }
输出:

 String [] s = {    "StringSignOut",
                         "String Sign Out",
                         "String SIGNOUT",
                         "StringSO",
                         "String SO",
                         "String S.O.",
                         "StringS.O."};
     for(String s2 : s)
     {
         System.out.println(s2.replaceAll("SignOut| Sign Out| SIGNOUT|SO| SO| S.O.|S.O.", ""));
     }
String
String
String
String
String
String
String
String
String
String
String
String
String
String
图案说明:

 String [] s = {    "StringSignOut",
                         "String Sign Out",
                         "String SIGNOUT",
                         "StringSO",
                         "String SO",
                         "String S.O.",
                         "StringS.O."};
     for(String s2 : s)
     {
         System.out.println(s2.replaceAll("SignOut| Sign Out| SIGNOUT|SO| SO| S.O.|S.O.", ""));
     }
String
String
String
String
String
String
String
String
String
String
String
String
String
String
  • (?i)
    不区分大小写的修饰符
  • \s*
    匹配零个或多个空格字符
  • (?:…)
    非捕获组
  • sign\s*out
    匹配字符串符号后跟零个或多个空格,然后再后跟字符串
    out
  • |
    逻辑OR运算符
  • s\W*o\W*
    匹配以下字符串:文本
    s
    后跟零个或多个非单词字符,然后是文本
    o
    后跟零个或多个非单词字符
    • 这对我来说很有效:

          String[] strings = new String[] {"StringSignOut","String Sign Out","String SIGNOUT","StringSO","String SO","String S.O."};
          for(String str : strings)
          {
              System.out.println(str.replaceAll("(?i)(sign\\s*out)|(s\\.?o\\.?)",""));
          }
      
      收益率:

      String
      String 
      String 
      String
      String 
      String 
      
      输出

      String
      String 
      String 
      String
      String 
      String 
      String
      
      使用以下命令:

      (?:\s*Sign\s*Out|\s*S\W?O\W?)
      
      此处演示:

      您能发布预期的输出吗?我希望上面的所有内容都是“字符串”。注销、SO等是否保证在
      字符串的末尾?另外,您是否使用“字符串”作为实际数据的占位符?不保证,大多数情况下都是这样。OP注意到,
      注销
      S.O.
      等并不总是在字符串的末尾。在这种情况下,这将无法发挥作用。先生,谢谢你指出这一点。我将从末尾删除$,以便它也开始为您的场景工作。是的!对于你链接到那里的漂亮工具,+1。这非常有效!但我有几个人没有工作(沙漏注销,Lavoy注销,AtlasTruckingS.o.)。我尝试了
      String companyName=line.replaceAll((?I)(?:\\s*Sign\\s*Out | \\s*s\\W?O\\W?),“”)
      使其不区分大小写,但我的可怜字符串“Sore Sign Out”变为“re”。有什么想法吗?我最后做了
      line=line.replaceAll(“(?I)(?:\\s*Sign\\s*Out)”,”);字符串companyName=line.replaceAll(“(\\s*s\\W?O\\W?),”