2014-11-17 228 views
0

我在Java代码中一个字符串,它看起来像这样提取部分字符串从一个字符串在java中

String s="/wps/wcm/connect/ae539d07-ce65-434e-9d9e-9e4ade8d4aa1/Extra+Talk+Time+Voucher_29_may.xls?MOD=AJPERES&CACHEID=ae539d07-ce65-434e-9d9e-9e4ade8d4aa1";

我如何提取,"Extra+Talk+Time+Voucher_29_may.xls"从这个?

顺便说一句,我是新来的java。

+0

我发现,有多个正确答案here.cheers – Raj

回答

2

这不是花哨的,但有时简单直接很好。我已经为你一步一步地解决了这个问题。

public static void main(String[] args) { 

    String parseMe = "/wps/wcm/connect/ae539d07-ce65-434e-9d9e-9e4ade8d4aa1/Extra+Talk+Time+Voucher_29_may.xls?MOD=AJPERES&CACHEID=ae539d07-ce65-434e-9d9e-9e4ade8d4aa1"; 
    String[] questionMarkTokens = parseMe.split("\\?"); 
    String beforeQuestionMark = questionMarkTokens[0]; 
    String[] slashTokens = beforeQuestionMark.split("/"); 
    String afterLastSlashBeforeQuestionMark = slashTokens[slashTokens.length - 1]; 
    System.out.println(afterLastSlashBeforeQuestionMark); 
} 

\\?正在照顾java中更神秘的问题之一。 Split需要一个正则表达式。正则表达式对于?有特殊的含义。所以如果你想把它作为一个字面问号,你必须用斜杠来逃避它。但是,当解析字符串时,它也使用反斜杠作为转义字符。所以你必须用另一个斜线来逃避斜线才能看到前一个斜线。

这就是说,米沙可能是对的。有很多方法可以打破解析。如果你可以使用罐装做的话。仍然很高兴学会如何自己做。

5

使用replaceAll()使用正则表达式来提取它:

String filename = str.replaceAll(".*/([^/]+)\\?.*", "$1"); 

这整个输入相匹配,而捕获所述靶标(如组1),与第1组替换匹配(整个串)(使用一个正则表达式返回参考)。

正则表达式将所有内容匹配到一个斜线,然后捕获所有不是斜线直到(但不包括)问号,然后匹配任何后面的内容。

+0

我想这就是他想要的 [^ \ /] * \。xls的 –

+0

@fady自己尝试一下,看看它是否工作。而且,斜杠字符从不需要在正则表达式中转义。永远。它没有特别的意义。 – Bohemian

2

你可以拆分基于/字符串:

String[] arr = s.split("\/");

然后取出参数:

String filename = arr[arr.length()-1].split("\?",1);

3

您可以跳过正则表达式(因为你不需要它的力量或你呢?)和使用子串:

s1 = s.substring(s.lastIndexOf('/'), s.lastIndexOf('?')); 

这将检查您的字符串中位于您的最后正斜杠和问号之间的部分。如果其中任何一个不是真的(意味着你有其他部分你感兴趣),但它不会工作。

4

不解析网址,你自己

String s="/wps/wcm/connect/ae539d07-ce65-434e-9d9e-9e4ade8d4aa1/Extra+Talk+Time+Voucher_29_may.xls?MOD=AJPERES&CACHEID=ae539d07-ce65-434e-9d9e-9e4ade8d4aa1"; 
Path p = Paths.get(URI.create(s).getPath()); 
String filename = p.getFileName().toString(); 
2

你可以试试这个:

String b = s.substring(s.lastIndexOf("/")+1 , s.indexOf("?")); 

,这将给你的所有过去的/和第一?之间的文本,但不包括其中的两个。输出是:

Extra+Talk+Time+Voucher_29_may.xls 
1

使用分割字符串

String[] g = s.split("/"); 
    String sas = g[5]; 
    String[] filenamesa = sas.split("\\?"); 
    System.out.println(filenamesa[0]);