![如何使用正则表达式在两处找到混合有 \x20 \t 和 \xA0 的字符串,并将其都替换为 \xA0(并且找不到完整的字符串)?](https://linux22.com/image/1665184/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9C%A8%E4%B8%A4%E5%A4%84%E6%89%BE%E5%88%B0%E6%B7%B7%E5%90%88%E6%9C%89%20%5Cx20%20%5Ct%20%E5%92%8C%20%5CxA0%20%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%B9%B6%E5%B0%86%E5%85%B6%E9%83%BD%E6%9B%BF%E6%8D%A2%E4%B8%BA%20%5CxA0%EF%BC%88%E5%B9%B6%E4%B8%94%E6%89%BE%E4%B8%8D%E5%88%B0%E5%AE%8C%E6%95%B4%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%89%EF%BC%9F.png)
我想要搜索这个模式:
例 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
然而它并没有按预期工作,因为
([az]+) 组消失了,我得到的
3 2,41
是3 Joh 2,41
此外,它不断找到两个 \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