【问题标题】:What is the regular expresion for all capital letters and all non alphabetic characters [closed]所有大写字母和所有非字母字符的正则表达式是什么[关闭]
【发布时间】:2021-12-15 04:59:31
【问题描述】:

我只需要所有非字母字符和大写字母的正则表达式。

let str = "ThisIs-an_example";

我应该使用什么正则表达式来正确使用 arr.join 分隔单词,使其成为“这是一个示例”

【问题讨论】:

  • 在 Perl 中,我会拆分 [^\p{Lu}\P{alpha}]+。 (LuGeneral_Category=Uppercase_Letter 的缩写。AlphaAlphabetic 的缩写)。不知道 JS 对 Unicode 属性的支持有多好。
  • 这个问题是this outage生效前的最后一个问题。
  • 如果使用 2018 JS。 let str = "ThisIs-an_example k ALL"; str.match(/\p{Lu}?\p{Ll}+|\p{Lu}/gu); regex101.com/r/BtNUMR/1 然后根据需要降低。

标签: javascript regex regex-group


【解决方案1】:

这样的?

let str = "ThisIs-an_example";
let result = str.replace(/([A-Z])/g, ' $1').toLowerCase().trim().replace(/[^a-z]/g, ' ');

不完全符合您的要求(数组),但可以完成工作。

【讨论】:

  • é 失败
【解决方案2】:

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(" "));

说明

正则表达式

[^A-Za-z] 匹配从“A”到“Z”以及“a”到“z”的每个非字母字符。 在示例中,它将在第二个“s”和第一个“a”之间找到“-”。之后它会在字母“n”和“e”之间找到“_”。

(?=[A-Z]) 匹配后跟从“A”到“Z”的大写字母的所有内容,但不匹配字母(我们希望保留字母)。 在示例中,它将找到字符串开头和“T”之间的“点”。之后它会找到字母“s”和“I”之间的“点”。

| 匹配之前或之后的内容。 在示例中,它将匹配前面解释过的表达式的混合。

+ 标记的表达式 ([^A-Za-z]) 将至少匹配一次。 这将避免双重/混合的非字母字符(例如:“ThisIs-,.-$$##@!(*&%33--an_example"),并且不会给你空字符串时它是分裂的。

拆分/小写

.map(s => s.toLowerCase()) 将确保数组中的所有字符串都是小写的。如果您想保留大写字母,只需将其删除即可。

测试样本

  • 这是一个例子
  • this_is-AnExample
  • 这是一个例子
  • this_is_an_example
  • 这是一个例子
  • 这是一个例子
  • 这是一个例子
  • 这___是__an_example
  • 这--是-一个--_example
  • 这是一个例子
  • this0000is11111an222222example
  • 这是-,.-$$##@!(*&%33--an_example

所有这些样本都将使用给定的代码返回this is an example

【讨论】:

  • é 失败
  • @ikegami ,实际上这并没有失败。假设问题没有提到任何特定的非英文字母(并且问题是英文),您不能假设它也将用于重音字符。如果是这种情况,我们将需要映射每个可能的重音字母字符。想象一下所有拉丁字符en.wiktionary.org/wiki/Appendix:Latin_script
  • Re "假设问题没有提到任何特定的非英文字母",没错。然而,你以某种方式对待他们不同。 // 关于“你不能假设它也将用于重音字符”,是的,但你不能安全地假设它也不会。我没有做任何假设;我只是说它不适用于é。您的解决方案认为 é 是大写或非字母,但两者都不是。 认为没关系。也许是的。但这仍然是您所做的一个假设,需要提及。
  • 简而言之,对您的解决方案可以处理的内容做出假设或限制是可以的,但您必须记录它们。这就是我所做的一切。
  • (仅供参考,我没有投反对票)
【解决方案3】:

您可以在非字母字符上 split 或大写字母前瞻。

let str = "ThisIs-an_example";
let parts = str.split(/(?=[A-Z])|[^a-z]/);
console.log(parts);
console.log(parts.join(' ').toLowerCase());

【讨论】:

  • é 失败
  • 很难相信这个问题没有重复
【解决方案4】:

你有几个问题。首先是 split 不包括分隔符,所以如果你只在任何大写或非字母字符上进行分割,那么你最终会丢失大写字母。 (见第一个例子)。

因此,您可以拆分非字母字符或大写字符的零宽度断言(参见第二个示例),但最终字符串中的大小写存在问题。如果你想处理它,你必须映射回来(见第三个例子)。

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(" "));

另请注意,这将根据包含的任何数字进行拆分。如果您希望数字永远出现,则必须修改表达式。

【讨论】:

  • é 失败
【解决方案5】:
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() 方法,它将返回一个包含匹配项的数组

【讨论】:

  • 使用匹配解决方案。
  • 谢谢!我其实也很喜欢你的版本,从来没有见过用那种方式制作的
  • é 失败
  • @ikegami chill,他举了一个例子,我回答了这个例子的可能解决方案,就像这里的每个人一样。我(以及这​​里的每个人)只是在提供他可以从事的工作,因为我没有为他的软件获得报酬。您也可以只评论或编辑,而无需对他发布的答案的真正解决方案投反对票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多