我试图使用正则表达式,以便只从一个句子中提取前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]+)?$
提前谢谢。
简单的方法是从末尾来看这个问题:您希望将空白或字符串的末尾作为正则表达式的最后一个内容进行匹配。在此之前,需要有字符串的开头或最后一个匹配的结束位置,并且在这之间最多有30个字符。
((^|G).{0,30})( |$)
这与输入数据匹配如下:
Verwaltungsgesetze
^
Gesetze des Landes Berlin
^
Deutsche Gesellschaftsgeschichte
^
Donaudampfschiffahrtskapitänspatent
(no match)
对于长度超过30个字符的单词的边缘大小写,您将完全得不到匹配。
Regex 101
您可以按照我的示例获取文本:
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