条件正则表达式返回空字符串

时间:2016-05-25 08:45:16

标签: java regex

我需要有条件正则表达式的帮助 我需要的是:如果输入包含某个单词返回空字符串,则提取年份

我有正则表达式

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var bodyParser = require('body-parser');
var ejs = require('ejs');
// view engine setup
 app.engine('.html', ejs.__express);
app.set('view engine', 'html');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static('public'));

var routes = require('./routes/index');
app.use('/', routes);
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

实施例: ((?=AVOID))|(\d{4})(.*) 输入: 提取TEST1 AVOID TEST2 2016 TEST3 TEST4 是正确的 empty string 输入: 提取TEST1 TEST2 2016 TEST3 TEST4 即可 2016 输入: 提取TEST1 TEST2 2016 TEST3 TEST4 AVOID 这是不正确的,因为2016位于输入的末尾

任何帮助?

1 个答案:

答案 0 :(得分:3)

您可以使用

/^(?!.*\bAVOID\b).*?\b(\d{4})\b/

请参阅regex demo

如果字符串中没有AVOID作为整个单词,这将提取作为整个单词的第一个4位数块。

如果4位数字始终用空格括起来,请使用

/^(?!.*\bAVOID\b).*? (\d{4}) /

查看updated regex demo(测试独立字符串时,可以用\s替换空格)。

模式详情

  • ^ - 字符串开头
  • (?!.*\bAVOID\b) - 负向前瞻,检查行是否有整个单词AVOID,如果是,则返回不匹配(使用DOTALL修饰符匹配行)
  • .*? - 0+除换行符以外的任何字符(使用DOTALL修饰符匹配各行)
  • \b(\d{4})\b - 任意4个数字。

注意.*?将在第一个4位整字词组之前匹配尽可能少的字符(因为不情愿的量词*?)。如果你需要获得最后4位数的整个单词块,请使用贪婪的对应.*。您可以进一步尝试指定\d{4}周围的上下文。

请参阅Java demo

List<String> strs = Arrays.asList("TEST1 AVOID TEST2 2016 TEST3 TEST4", "TEST1 TEST2 2016 TEST3 TEST4", "TEST1 TEST2 2016 TEST3 TEST4 AVOID");
String pat = "^(?!.*\\bAVOID\\b).*?\\b(\\d{4})\\b";
for (String str : strs) {
    Matcher m = Pattern.compile(pat).matcher(str);  
    if (m.find()) {
        System.out.println(m.group(1));   // return m.group(1)
    } else {
        System.out.println("No match for " + str + " :("); // return "" here
    }
}

结果:

No match for TEST1 AVOID TEST2 2016 TEST3 TEST4 :(
2016
No match for TEST1 TEST2 2016 TEST3 TEST4 AVOID :(