替换不需要的字符时如何防止某些单词一起运行?

Posted

技术标签:

【中文标题】替换不需要的字符时如何防止某些单词一起运行?【英文标题】:How can I prevent some words from being run together when replacing unwanted characters? 【发布时间】:2020-10-19 05:29:34 【问题描述】:

我想去掉逗号、句号、引号等所有字符,这样一行:

婴儿汉斯·帕特里克(Hans Patrick)以通常的方式接受他的哺乳香膏,而不是通过专利瓶的工具。当他还是个孩子的时候,他的一个任性就是用他的小肺的所有力量尖叫,当他受到父母严厉的惩罚时。这种奇异的习惯只是对使他成熟得如此杰出的天才的一个预兆。

...将转化为以下内容:

The infant Hans Patrick received his mammarial balm in the usual way and not through the instrumentality of a patent bottle One of his caprices when yet a child was to scream with all the force of his little lungs when he was severely chastised by his parents This singular habit was but a foreshadowing of that genius which has rendered him so eminent in his maturity

通过这种方式,我可以在空格处拆分单个单词,并且单词末尾没有标点符号。

我正在尝试用这段代码来做到这一点:

Regex onlyAlphanumericSpaceApostropheAndHyphen = new Regex("[^a-zA-Z0-9 '-]");
. . .
doc1StrArray = File.ReadAllLines(sDoc1Path, Encoding.UTF8);
. . .
foreach (string line in doc1StrArray) 

    trimmedLine = line;
    trimmedLine = trimmedLine.Replace("—", " ");
    trimmedLine = onlyAlphanumericSpaceApostropheAndHyphen.Replace(trimmedLine, "");
    string[] subWords = trimmedLine.Split();

...但它并非在所有情况下都有效,我不明白为什么它通常有效,但其他时候会去掉空格字符,从而将两个单词一起运行,这样在单步执行后该行就变成了这样上面第二行代码:

婴儿汉斯·帕特里克 (Hans Patrick) 以通常的方式而不是通过专利瓶的工具获得他的乳膏这种独特的习惯只是预示着他的成熟使他在他的成熟中脱颖而出

所以,一些单词会一起变成一个单词(它们之间没有空格):

theusual
patentbottle
screamwith
severelychastised
aforeshadowing
soeminent

为什么会发生这种情况,我该如何防止它继续发生?

【问题讨论】:

这些单词之间的空格似乎不是空格字符。也许它们是其他形式的空白;如果将正则表达式更改为 [^a-zA-Z0-9\s'-],会发生什么? 文本中可能存在不间断空格或制表符等其他空白字符。 我认为它们可能是换行符;如果您查看固定宽度字体的文本并断开theusual 之间的第一行,所有其他连接的单词出现在行边界上。 @Nick:有了这个:Regex onlyAlphanumericSpaceApostropheAndHyphen = new Regex("[^a-zA-Z0-9\s'-]");我得到“无法识别的转义序列” @B.ClayShannon 你需要转义反斜杠 【参考方案1】:

这些单词之间的空格似乎不是空格字符。鉴于文本在固定宽度字体中的外观,在第一个问题 (the usual) 中被破坏:

The infant Hans Patrick received his mammarial balm in the 
usual way, and not through the instrumentality of a patent 
bottle. One of his caprices, when yet a child, was to scream 
with all the force of his little lungs, when he was severely 
chastised by his parents. This singular habit was but a 
foreshadowing of that genius which has rendered him so 
eminent in his maturity.

它显示了在换行符处发生的所有问题,看起来它们是换行符。您可以通过将正则表达式中的空格更改为 \s 来解决此问题,以保留所有形式的空格(注意 \ 必须在 c# 正则表达式中转义):

Regex onlyAlphanumericSpaceApostropheAndHyphen = new Regex("[^a-zA-Z0-9\\s'-]"); 

【讨论】:

@B.ClayShannon 好吧,这是一个非常令人惊喜的醒来!感谢您的慷慨,这不是必需的,但非常感谢。

以上是关于替换不需要的字符时如何防止某些单词一起运行?的主要内容,如果未能解决你的问题,请参考以下文章

字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd

如何替换图像的某些单词

使用 scikit-learn 的术语文档矩阵时,如何防止带有连字符的单词被标记?

我们如何在匹配两个文本文件时查找和替换单词?

javascript regex 至少需要一个字母,一个数字并防止添加某些单词

如何使用正则表达式匹配不以某些字符开头或结尾的单词?