将单词匹配为单独的字符串,除非它们以大写字母开头

时间:2017-11-24 12:13:00

标签: javascript regex

我有这个正则表达式

/[A-Za-zÀ-ÿ]+/g

匹配由无限长度的字符组成的“单词”。

如果我想排除以大写字母开头的单词?

我试过

/(^[A-Z])[A-Za-zÀ-ÿ]+/g

但它似乎不起作用。不能使用/ w这样的东西,因为它不包括变音符号。

编辑:正在使用的语言是Typescript所以javascript引擎(例如不允许使用lookbehind)很抱歉没有提及。

编辑:给出的输入可以是

"foo"            //should match foo and return true
"Foo"            //should not match foo and return false
"fòo"            //should match fòo and return true
" "              //should not match foo and return false
"."              //should not match foo and return false
","              //should not match foo and return false

代码(Typescript)匹配没有大写字母的东西

isProperWord(word){
    /* rejects
      - string that are not words (symbols, spaces, etc...)
      - names (words starting with a capital letter)
    */
    if(word.match(/[A-Za-zÀ-ÿ]+/g)){
      return true;
    }else{
      return false;
    }

}

2 个答案:

答案 0 :(得分:3)

表达式^[A-Z]表示匹配行开头的大写字符。您可能尝试键入[^A-Z],该字符与A和Z之间不是大写字母的字符匹配,但仍然没有帮助,因为正则表达式引擎会找到与此匹配的字符,并且在线北京。 (例如,一个空间平凡地匹配它 - 它是一个角色,它不在A到Z的范围内。)

如果您使用的词法边界与\b理解正则表达式,请尝试

/\b[a-z][A-Za-z]*/

匹配左侧有字边界的标记,以及与其相邻的小写字符。 (我忽略了你的语言环境扩展,它不可移植,可能没有明确定义。)

孤立地,/g标志不做任何事情。如果你有一种语言支持它,并在while循环或类似的循环中使用正则表达式,它将导致引擎返回字符串中的所有匹配,一次一个,在循环内;但没有进一步的背景,我们不知道这是否真的存在。

答案 1 :(得分:1)

要匹配初始范围内的所有大写字母,您可以使用[A-ZÀ-ÖØ-Þ]字符类。要匹配所有小写字母[a-zß-öø-ÿ]。请注意,×÷不是字母,我将其从这些类中删除。

要确保整个字符串仅包含这些字母,并且第一个字符不是大写字母,请使用

/^[a-zß-öø-ÿ][A-Za-zÀ-ÖØ-öø-ÿ]*$/

请参阅regex demo

JS演示:

var strs = ['foo','fòo','Foo',' ','.',','];
var rx = /^[a-zß-öø-ÿ][A-Za-zÀ-ÖØ-öø-ÿ]*$/;
for (var s of strs) {
  console.log(s,"=>",rx.test(s));
}

要提取单词,请使用自定义边界:

var s = 'foo,fòo,Foo';
var rx = /(?:[^A-Za-zÀ-ÖØ-öø-ÿ]|^)([a-zß-öø-ÿ][A-Za-zÀ-ÖØ-öø-ÿ]*)(?![A-Za-zÀ-ÖØ-öø-ÿ])/g;
var m, res=[];
while(m=rx.exec(s)) {
  res.push(m[1]);
}
console.log(res);