我只需要所有非字母字符和大写字母的正则表达式。
let str = "ThisIs-an_example";
我应该使用什么正则表达式来使用arr.join正确地分隔单词,使其成为";这是一个例子";
您遇到了几个问题。首先,拆分不包括分隔符,所以如果你只拆分任何大写或非字母字符,那么你最终会丢失大写字母。(参见第一个示例)。
因此,您可以拆分非字母字符,也可以拆分后面的大写字符的零宽度断言(参见第二个示例),但最后一个字符串中的大小写有问题。如果你想处理这个问题,你就必须往回映射(见第三个例子)。
let str = "ThisIs-an_example";
let arr = str.split(/[^a-z]/);
console.log(arr);
arr = str.split(/[^A-Za-z]|(?=[A-Z])/);
console.log(arr.join(" "));
let cased = arr.map((a,i)=>{return i>0 ? a.toLowerCase() : a});
console.log(cased.join(" "));
还要注意,这将在包含的任何数字上进行拆分。如果希望数字出现,则必须修改表达式。
您可以对非字母字符split
或大写字母的先行查找。
let str = "ThisIs-an_example";
let parts = str.split(/(?=[A-Z])|[^a-z]/);
console.log(parts);
console.log(parts.join(' ').toLowerCase());
TLDR
const regex = /[^A-Za-z]+|(?=[A-Z])/;
let str = `ThisIs-an_example`;
let arr = str.split(regex).map(s => s.toLowerCase());
console.log(arr.join(" "));
解释
Regex
CCD_ 2匹配"0"中的每一个非相位字符;A";至";Z";并且对于";a";至";z";。在这个例子中,它会发现"-"在第二";s";而第一个";a";。之后,它将找到"_"在字母"之间;n〃;以及";e";。
CCD_ 3匹配后面跟有来自";A";至";Z";,但不是这封信(我们想保留这封信)。在这个例子中;点";在字符串的开始和";T";。之后,它将找到";点";在字母"之间;s";以及";我";。
|
匹配之前或之后的内容。在这个例子中,它将与前面解释的表达式相匹配。
+
标记的表达式([^A-Za-z]
)将至少匹配一次。这将避免双重/混合的非多相字符(例如:"ThisIs-,.$$#@!(*&%33--an_example"),并且在拆分时不会给您空字符串。
拆分/小写
.map(s => s.toLowerCase())
将确保数组中的所有字符串都是小写的。如果你想保留大写字母,就去掉它。
测试样品
- 这是一个示例
- this_is-A示例
- 这是一个例子
- this_is_an_example
- 这是一个例子
- 这是一个例子
- 这是一个例子
- 这个例子
- 这个--是-一个--示例
- 这是一个例子
- this0000111112222示例
- 这是-,.-$$###@!(*&%33--示例
所有这些样本都将使用给定的代码返回this is an example
。
类似的东西?
let str = "ThisIs-an_example";
let result = str.replace(/([A-Z])/g, ' $1').toLowerCase().trim().replace(/[^a-z]/g, ' ');
不是你想要的(数组),但完成了任务。
const regex = /[A-Za-z]([a-z]+)?/g;
const regexWithNumbers = /[A-Za-z0-9]([a-z0-9]+)?/g;
console.log('456-456_43265'.match(regex)) // null
console.log('456-456_43265'.match(regexWithNumbers)) // ["456", "456", "43265"]
console.log('ThisIs-an_example'.match(regex)) // ["This", "Is", "an", "example"]
console.log('ThisIs-an_example'.match(regexWithNumbers)) // ["This", "Is", "an", "example"]
console.log('This0Is-an_example'.match(regex)) // ["This", "Is", "an", "example"]
console.log('This0Is-an_example'.match(regexWithNumbers)) // ["This0", "Is", "an", "example"]
console.log('ThisIs-an_0example'.match(regex)) // ["This", "Is", "an", "example"]
console.log('ThisIs-an_0example'.match(regexWithNumbers)) // ["This", "Is", "an", "0example"]
console.log('ThisIs-a0n_example'.match(regex)) // ["This", "Is", "a", "n", "example"]
console.log('ThisIs-a0n_example'.match(regexWithNumbers)) // ["This", "Is", "a0n", "example"]
console.log('ThisIs-an_exa0mple'.match(regex)) // ["This", "Is", "an", "exa", "mple"]
console.log('ThisIs-an_exa0mple'.match(regexWithNumbers)) // ["This", "Is", "an", "exa0mple"]
这个正则表达式似乎可以工作,但是你不能使用split方法,因为它会删除你从原始字符串中传递的字符,如果你不希望分割ThisIs
之类的东西,这是可能的。
因此,使用String.proptotype.match()
方法,它将返回一个具有匹配的数组