从字符串中删除所有分数符号,如“¼”和“½”

64

我需要修改类似于"¼ 杯糖"的字符串为"杯糖",也就是将所有分数符号替换为""。

我参考了这篇文章,通过以下代码成功删除了"¼":

itemName = itemName.replaceAll("\u00BC", "");

但是我如何替换所有可能存在的分数符号呢?


2
Java不是Android。 - Ungeheuer
19
也许我在 cooking.se 上花费的时间太长了,但我想知道为什么你这样做(而不是用“1/4杯糖”替换“1/4杯糖”)。 - Chris H
6
我可以问一下为什么您想完全删除那些会改变字符串语义含义的内容吗?我很好奇。 - Matti Virkkunen
2
@ChrisH和Matti - 我正在开发一个食谱和购物清单的应用程序 - 我正在使用一个API,该API返回一个JSON,其中包含所需数量的配料。我仍然保留原始字符串,但给用户提供了一种选择,即按其“干净名称”分组查看项目(因此他们只能看到一个项目),而不是看到5行不同数量的大蒜。我解释得对吗?抱歉,我是个彻头彻尾的新手。 - Michelle
2
如果是为了烹饪应用程序,我建议仅对有限数量的分数进行硬编码替换,例如1/2到1/10。我从未见过需要1/1076的食谱... - Ian Newson
显示剩余3条评论
2个回答

97

¼½ 这样的分数符号属于 Unicode 类别 Number, Other [No]。如果您可以接受消除该组中的所有 676 个字符,则可以使用以下正则表达式:

itemName = itemName.replaceAll("\\p{No}+", "");

如果没有,默认情况下,您始终可以明确列出它们:

// As characters (requires UTF-8 source file encoding)
itemName = itemName.replaceAll("[¼½¾⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞↉]+", "");

// As ranges using unicode escapes
itemName = itemName.replaceAll("[\u00BC-\u00BE\u2150-\u215E\u2189]+", "");

2
请注意,字体可能会将任何序列(如23/12)呈现为分数,从而使任何分数都可以以此方式显示,而不仅仅是预先组合的分数。如果发生这种情况,您可能需要删除的内容不仅仅是一系列字符。 - Joey
1
@HopefullyHelpful 在这种情况下,+ 运算符会导致字符集 ([...]) 多次重复。请查阅此答案获取更多细节:https://dev59.com/FW865IYBdhLWcg3wYNZS#3850256 - Ethan
6
@HopefullyHelpful 是的,它们不是必需的,而且应该提高效率。也许不应该从中得出结论,但如果您在此regex101示例中的表达式末尾添加一个“+”,执行时间将从1毫秒降至0毫秒,步骤数将从32个减少到14个。对于没有任何重复的输入,它只会增加一步。 - Aaron
1
@Aaron,我会用https://regex101.com/r/9Md35x/1来反驳这个结论,变化似乎微不足道,我认为可能是JavaScript实现和流预测的原因。 - HopefullyHelpful
1
@HopefullyHelpful 哦?在我的测试中,使用“+”似乎表现稍微好一些,步骤数从148305降至139377,时间从约375毫秒降至约350毫秒。无论如何,感谢您花时间制作出一个好的数据集!您说得对,这可能取决于正则表达式引擎的具体情况。 - Aaron
显示剩余2条评论

2
您可以使用以下正则表达式将所有分数替换为空字符串。
str = str.replaceAll("(([\\xbc-\\xbe])?)", "")

6
为什么额外的捕获组 () 和可选项 ? 匹配? - MT0
12
好的,如果需要的话,您想用""替换""。 - HopefullyHelpful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接