正则表达式 - 拆分每个字符,除非 #N?

RegEx - Split Every Charachter Unless #N?

我希望将一个字符串单独拆分成单独的字符,但不应拆分数字序列,并且后面跟有 n 的数字不应该是 split

因此 4h12u/o15n 将拆分为:

4
h
12
u
/
o
15n

我试了好几种方法都没有用。

(?!\dn)

你可以尝试用这种模式分割:

(?:^|(?<=\d)n|$)(*SKIP)(*FAIL)|

回溯控制动词的组合(*SKIP)(*FAIL)强制模式失败并且不重试左侧位置。 (*SKIP)表示如果模式失败,请不要重试所有在我左边匹配的(*FAIL) 强制失败。

但是有一个更简单的方法:根本不拆分!

您可以通过简单的全球研究获得相同的结果:

\dn|.

更传统的分割方式:

(?<=\d)(?!n|$)|(?<!\d|^)(?=n)|(?<!\d|^)(?!n|$)

试试这个:

(?<!\d)|(?!n)

这将在 不跟在数字后面, 不在 'n' 之前的每个位置拆分。

使用split时需要指定分隔符。在这种情况下没有实际的分隔符,因此 split 不是完成这项工作的最佳工具。正则表达式匹配是。

my @a = /\d+n?|./g;

并不意味着它不能使用 split 来完成。

# Between non-digit and following digit, and
# Between digit and following non-digit other than "n".
my @a = split /(?<=\D)(?=\d)|(?<=\d)(?=[^\dn])/;

知道 split 不会尝试在字符串的开头拆分,并且知道 split 默认删除空尾随字段,以上可以简化为

my @a = split /(?<!\d)|(?!\dn)/;