复杂正则表达式,最多30个字符

时间:2018-10-30 11:24:21

标签: regex

我正在尝试使用正则表达式以便仅从句子中提取前30个字符以内的一次。一些用例可能是一个超过30个字符的单词,所以我想将其分为两个输出。

简单的例子:

Verwaltungsgesetze

输出应为

Verwaltungsgesetze

另一个简单的方法:

Gesetze des Landes Berlin

输出应为:

Gesetze des Landes Berlin

更复杂的一个:

Deutsche Gesellschaftsgeschichte

我希望将输出分成两个结果

1. Deutsche
2. Gesellschaftsgeschichte

原因是因为“ Deutsche Gesellschaftsgeschichte”一词总共为33个字符,但在30个字符后再将其切掉是没有意义的,因此将其分为两个部分更有意义。

我用它来查找最多30个字符,但我不知道如何支持我描述的最后一种情况。

^(?=.{1,30}$)[A-Za-z0-9]+(?:\s[A-Za-z0-9]+)?$

谢谢。

2 个答案:

答案 0 :(得分:0)

简单的方法是从头开始看这个问题:您想将空格或字符串的末尾作为正则表达式的最后一项来匹配。在此之前,需要有一个字符串的开头或最后一个匹配项停止的地方,且最多30个字符之间。

((^|\G).{0,30})( |$)

这将匹配输入数据,如下所示:

Verwaltungsgesetze
                  ^
Gesetze des Landes Berlin
                         ^
Deutsche Gesellschaftsgeschichte
        ^
Donaudampfschiffahrtskapitänspatent
(no match)

对于单词长度超过30个字符的特殊情况,您将根本找不到匹配项。

Regex 101

答案 1 :(得分:0)

您可以按照我的示例获取文本:

let str_input = `Deutsche Gesellschaftsgeschichte
Gesetze des Landes Berlin
Gesetze des Landes Berlinxxxxxx`;

let arr_input = str_input.split("\n");
let regex = /(?=^.{31,}$)(\w+)\s([\w ]+)|(?=^.{1,30}$)([\w ]+)/;
for(let i=0; i<arr_input.length; i++){
  let temp_str = arr_input[i];
  temp_str.replace(regex, function(match,text1,text2){
    if(text2){
      console.log(`Case 2: Text is over 30 character. \nContent1=${text1} \nContent2=${text2}`);
    }else{
      console.log(`Case 1: Text is in 30 character. Content=${match}`);
    }
  });
}

在regex101中查看详细信息:https://regex101.com/r/ydjwB6/1