[英]How to get specific substring with option vale using java
我有一个字符串,从这个字符串,我想获得一个由选项(-sn)标识的密码文件路径。
String s = "msqlsum81pv 0 0 25 25 25 2 -sn D:\workdir\PV_81\config\sum81pv.pwf -C 5000"
上面的行是一个配置行,可以使用-sn
或-n
。 请建议如何从上面的字符串中获取D:\\workdir\\PV_81\\config\\sum81pv.pwf
行,否则字符串可能带有带引号的字符串。
下面是我的代码,只检查-sn选项,但我想检查-sn或-n。
if ( s.matches( "^\\s*msql.*$" ) )
{
StringTokenizer st = new StringTokenizer( s, " " );
while ( st.hasMoreTokens() )
{
if ( st.nextToken().equals( "-sn" ) )
{
pwf = st.nextToken();
}
}
}
我想使用StreamTokenizer而不是StringTokenizer类,并获得D:\\workdir\\PV_81\\config\\sum81pv.pwf
此路径可能包含空格。
String s = "msqlsum81pv 0 0 25 25 25 2 -sn D:\workdir\PV_81\config\sum81pv.pwf -C 5000"
if ( s.matches( "^\\s*msql.*$" ) )
{
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF)
{
System.out.println(tokenizer.sval);
}
}
您应该使用正则表达式以更一般的方式检测该选项。 如果你想要一个快速修复,你可以在你的if中使用OR
运算符,但每次出现新的操作时你的if会增长,这是一个坏主意。
if ( s.matches( "^\\s*msql.*$" ) )
{
StringTokenizer st = new StringTokenizer( s, " " );
while ( st.hasMoreTokens() )
{
string token = st.nextToken();
if ( token.equals( "-sn" ) || token.equals("-n" ) )
{
pwf = st.nextToken();
}
}
}
使用正则表达式,如本例所示
public static void main(String[] args) {
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -sn D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -s D:\\workdir\\PV_81\\config\\sum81pv.pwf -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -sn \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));
System.out.println(findString("msqlsum81pv 0 0 25 25 25 2 -s \"D:\\workdir\\PV_81\\config\\sum81pv.pwf\" -C 5000"));
}
private static String findString(String inputCommand) {
String path;
if(inputCommand.matches(".*(-sn|-s) \"+.*")) {
path = inputCommand.replaceAll(".*(-sn|-s) \"?([^\"]*)?.*", "$2");
} else {
path = inputCommand.replaceAll(".*(-sn|-s) \"?([^ ]*)?.*", "$2");
}
return path;
}
O / P
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
D:\\workdir\\PV_81\\config\\sum81pv.pwf
编辑:请注意,如果路径可能包含空格,则可能需要修改此项。 然后你可能想检查直到-C
或总是逃离整个路径并检查下一个"
将出现的时间。
正如在这个答案中指出的,你可以使用任何好的命令行参数解析器,如:
Commons CLI
http://commons.apache.org/cli/
getopt的
http://www.urbanophile.com/arenn/hacking/download.html
绝对使用正则表达式,我的答案如下
public static String extractString(final String input) {
String ret = null;
final Pattern pattern = Pattern.compile("(..\\\\.*\\.*?)(?:\"?)\\p{Space}");
final Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
ret = matcher.group(1);
}
return ret;
}
基本上,我从点后第一个'\\'搜索第一个空格,并提取这个子字符串,如果有一个,使用捕获组过滤引号
因此,此子字符串在此cmd字符串中的位置无关紧要
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.