使用regex java从字符串中查找子字符串

时间:2016-08-12 07:06:27

标签: java regex

我有一个字符串:

String s = "msqlsum81pv 0 0 25 25 25 2  -sn D:\\workdir\\PV 81\\config\\sum81pv.pwf -C 5000";

我想从此字符串中获取路径(在本例中为D:\\workdir\\PV 81\\config\\sum81pv.pwf)。此路径是命令选项-sn-n的参数,因此此路径始终显示在这些选项之后。

路径可能包含也可能不包含需要处理的空格。

public class TestClass {

     public static void main(String[] args) {
         String path;
         String s = "msqlsum81pv 0 0 25 25 25 2  -sn D:\\workdir\\PV 81\\config\\sum81pv.pwf -C 5000";
         path = s.replaceAll(".*(-sn|-n) \"?([^ ]*)?", "$2");
         System.out.println("Path: " + path);
     }
 }

当前输出:Path: D:\workdir\PV 81\config\sum81pv.pwf -C 5000
预期输出:Path: D:\workdir\PV 81\config\sum81pv.pwf

以下答案适用于早期案例。

i need a regex which return `*.pwf` path if the option is `-sn, -n, -s, -s -n, or without -s or -n.`

但如果我有以下情况,那么找到密码文件的正则表达式是什么。

String s1 = msqllab91 0 0 1 50 50 60 /mti/root/bin/msqlora    -n "tmp/my.pwf" -s 
String s2 = msqllab92 0 0 1 50 50 60 /mti/root/bin/msqlora -s -n /mti/root/my.pwf
String s3 = msqllab93 0 0 1 50 50 60 msqlora        -s -n "/mti/root/my.pwf" -C 10000 
String s4 = msqllab94 0 0 1 50 50 60 msqlora.exe    -sn   /mti/root/my.pwf 
String s5 = msqllab95 0 0 1 50 50 60 msqlora.exe    -sn   "/mti/root"/my.pwf 
String s6 = msqllab96 0 0 1 50 50 60 msqlora.exe    -sn"/mti/root"/my.pwf 
String s7 = msqllab97 0 0 1 50 50 60 "/mti/root/bin/msqlora" -s -n /mti/root/my.pwf -s
String s8 = msqllab98 0 0 1 50 50 60 /mti/root/bin/msqlora -s
String s9 = msqllab99 0 0 1 50 50 60 /mti/root/bin/msqlora -s -n /mti/root/my.NOTpwf -s -n /mti/root/my.pwf
String s10 = msqllab90 0 0 1 50 50 60 /mti/root/bin/msqlora -sn /mti/root/my.NOTpwf -sn /mti/root/my.pwf
String s11 = msqllab901 0 0 1 50 50 60 /mti/root/bin/msqlora
String s12 = msqllab902 0 0 1 50 50 60 /mti/root/msqlora-n NOTmy.pwf
String s13 = msqllab903 0 0 1 50 50 60 /mti/root/msqlora-n.exe NOTmy.pwf

如果选项为*.pwf,我需要一个返回-sn, -n, -s, -s -n, or without -s or -n.路径的正则表达式

路径只包含* .pwf文件扩展名,而不是NOTpwf或任何其他扩展名和代码应该全部工作,除了最后两个,因为它是一个无效的命令。

注意:我已经问过这类问题,但根据我的要求没有任何工作。 (How to get specific substring with option vale using java

4 个答案:

答案 0 :(得分:1)

您可以使用:

path = s.replaceFirst(".*\\s-s?n\\s*(.+?)(?:\\s-.*|$)", "$1");
//=> D:\workdir\PV 81\config\sum81pv.pwf

Code Demo

RegEx Demo

答案 1 :(得分:0)

试试这个

String s = "msqlsum81pv 0 0 25 25 25 2  -sn D:\\workdir\\PV 81\\config\\sum81pv.pwf -C 5000";
    int l=s.indexOf("-sn");
    int l1=s.indexOf("-C");
    System.out.println(s.substring(l+4,l1-2));

答案 2 :(得分:0)

您还可以使用:[A-Z]:.*\.\w+

Demo and Explaination

答案 3 :(得分:0)

我不是使用复杂的regexp进行替换,而是建议使用更简单的匹配

String s = "msqlsum81pv 0 0 25 25 25 2  -sn D:\\workdir\\PV 81\\config\\sum81pv.pwf -C 5000";
Pattern pattern = Pattern.compile("\\s-s?n\\s*(.*?)\\s*-C\\s+\\d+$");
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
    System.out.println(matcher.group(1)); 
} 
// => D:\workdir\PV 81\config\sum81pv.pwf 

请参阅IDEONE Demo

如果-C <NUMBER>在结尾是可选的,请使用可选组进行换行 - &gt; (?:\\s*-C\\s+\\d+)?$

模式详情

  • \\s - 空白
  • -s?n - -sn-ns?与可选的s匹配)
  • \\s* - 0+ whitespaces
  • (.*?) - 第1组匹配除换行符之外的任何0 +字符
  • \\s* - 同上
  • -C - 文字-C
  • \\s+ - 1+空格
  • \\d+ - 一位或多位
  • $ - 字符串结束。