如何使用正则表达式在两处找到混合有 \x20 \t 和 \xA0 的字符串,并将其都替换为 \xA0(并且找不到完整的字符串)?

如何使用正则表达式在两处找到混合有 \x20 \t 和 \xA0 的字符串,并将其都替换为 \xA0(并且找不到完整的字符串)?

我想要搜索这个模式:

例 1.: 1 Joh 3 例 2. 1 Joh 3,5

通常空格是单个 \x20,但它们可以是任何类型的空格(窄无间断空格、窄空格、空格、制表符等),不一定是单个。我想用 \xA0 替换不存在的空格。

为了实现这一点,我使用了以下方法:

寻找: ([0-9]{1,}+)([^\xA0])([a-z]{1,}+)([^\xA0])([0-9]{1,})(\,)*([\s]*)([0-9]{1,})*

代替: $1 $3 $5$6$8

这是可行的,但是它不仅会找到部分完成替换的字符串(这就是我想要确保不会错过用户应用了一个 \xA0 的情况),还会找到完全完成替换的字符串,而这是我所不想要的。

因此,问题是:如何专门搜索: 1\xa0Joh\s3 1\tJoh\xa03 1\xa0Joh\s3,6 1\sJoh\xa03,6

而且当然:

1\sJoh\s3,6

并不是:

1\xa0Joh\xa03 1\xa0Joh\xa03,6

所有这些都可以在文本中找到。例如:Lorem ipsum dolor 1 Joh 2,41 sit amet, consectetur (1 Joh 3) adipiscing elit, sed do eiusmod tempor [3 Joh 2,41] incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo_consequat。

其中 1\sJoh\Ax02,41 1\Ax0Joh\s3 3\sJoh\s2,41

最终的结果应该始终是:

1\xA0Joh\Ax02,41
1\xA0Joh\xA03
3\xA0Joh\xA02,41

或者,使用上面的真实示例并获得预期结果(替换表达式中的所有空格现在都为 \xA0):

Lorem ipsum dolor 约翰一书 2,41 sit amet, consectetur (约翰一书 3) adipiscing elit, sed do eiusmod tempor [约翰三书 2,41] incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo_consequat。

我试图改变你的正则表达式以制作非捕获组、捕获组,并且我将所有元素分组以便将它们粘贴到替换字符串中:

(\d+)((?=(\xA0)?)\s+)([a-z]+)(?!\1)(\s)(\d+)(,\d+)* 

代替:

$1 $3 $6$7

然而它并没有按预期工作,因为

  1. ([az]+) 组消失了,我得到的3 2,413 Joh 2,41

  2. 此外,它不断找到两个 \xA0 都已被替换的字符串,例如3 Joh 2,41,(两个 \xA0 都已被替换),这是我想要避免的。

你能看出哪里出了问题吗?谢谢!

答案1

根据澄清内容进行更新

  • 寻找:(\d+)\s+([a-z]+)\s+(\d+(?:,\d+)*)
  • 代替:$1\xAO$2\xA0$3

解释:

(\d+)           # group 1, 1 or more digits
\s+             # 1 or more any kind of white spaces
([a-z]+)        # group 2, 1 or more letters
\s+             # 1 or more any kind of white spaces
(               # group 3
    \d+             # 1 or more digits
    (?:,\d+)*       # non capture group, a comma followeed by 1 or more digits, may appear 0 or more times
)               # end group 3

相关内容