我需要有条件正则表达式的帮助 我需要的是:如果输入包含某个单词返回空字符串,则提取年份
我有正则表达式
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
位于输入的末尾
任何帮助?
答案 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 :(