繁体   English   中英

Java需要正则表达式从字符串中提取周数

[英]java Need regex to extract weeknumbers from string

我得到了可能包含一个或多个星期数的杂志名称列表。
例:

足球国际wk43
国家地理(wk50)
教科书wk39 / wk43
一些杂志周12至16
另一本杂志wk36_38
另一本杂志wk36_wk38

等等,我想要的是最后一部分。 所以:

国际足球周43
国家地理周50
课文第39周-第43周
一些杂志第12周-第16周
另一本杂志第36周-第38周
另一本杂志第36周-第38周

我开始于:

Pattern pat = Pattern.compile("(wk|week)[\\(\\_]?([0-9]{1,2}\\-?[0-9]{0,2})");

但这不适用于:

(some wk36 tm 42)", "(some wk36/wk37)", "(some wk36_wk37)", "some wk36_37", "some wk36_wk37"

我尝试执行以下操作:
读取直到Week或wk(wk | week)的第一次出现,然后获取所有内容。
用周替换每次出现的wk
以某种方式替换所有非数字字符(例如/ _-)。

但是我被卡住了。 有任何想法吗? 提前致谢。

您可以将Matcher#appendReplacement与以下正则表达式一起使用:

(?i)w(?:e{2})?k(\\d+)(?:(?:\\s*until\\s*|[ _\\/])(?:w(?:e{2})?k)?(\\d+))?

这是代码演示

String rx = "(?i)w(?:e{2})?k(\\d+)(?:(?:\\s*until\\s*|[ _\\/])(?:w(?:e{2})?k)?(\\d+))?"; 
String s = "Soccer International wk43\nNational Geopgraphic (wk50)\nSchoolpaper wk39/wk43\nSome magazine week12 until 16\nAnother magazine wk36_38\nAnother magazine wk36_wk38"; 
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile(rx).matcher(s);
while (m.find()) {
    String replacement = m.group(2) == null ? // Check if Group 2 is matched
            "week " + m.group(1):             // If not, use just Group 1
            "week " + m.group(1) + " - week " + m.group(2); // If yes, Group 2 is added
    m.appendReplacement(result, replacement); //  Add the replacement
}
m.appendTail(result);
System.out.println(result.toString());

针对更复杂场景的更新:

String rx = "(?i)w(?:e{2})?k\\s*(\\d+)(?: +(\\d{4})\\b)?(?:(?:\\s*(?:until|tm)\\s*|[ _/])(?:w(?:e{2})?k)?(\\d+)(?: +(\\d{4})\\b)?)?"; 
String s = "wk 1 2016\n(wk 47 2015 tm 9 2016)\nSoccer International wk43\nNational Geopgraphic (wk50)\nSchoolpaper wk39/wk43\nSome magazine week12 until 16\nAnother magazine wk36_38\nAnother magazine wk36_wk38"; 
StringBuffer result = new StringBuffer(); // week 47 (2015) - week 9 (2016)  
Matcher m = Pattern.compile(rx).matcher(s); // week 1 (2016)
while (m.find()) {
    String replacement = "";
    String prt1 = ""; String prt2 = "";
    if (m.group(2) != null) {
        prt1 += " (" + m.group(2) + ")";
    }
    if (m.group(4) != null) {
        prt2 += " (" + m.group(4) + ")";
    }

    if (m.group(3) == null) {
        replacement = "week " + m.group(1) + prt1;
    } else {
        replacement = "week " + m.group(1) + prt1 + " - week " + m.group(3) + prt2;
    }
    m.appendReplacement(result, replacement);
}
m.appendTail(result);
System.out.println(result.toString());

regex演示在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM