我想要搜索这个模式:
例 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