34

我希望使用getSkuDetails()来自应用内结算 v3 API 的调用来动态显示应用内购买选项列表,其中包含正确翻译的标题和相关价格。

但是,getSkuDetails() 中的“title”属性似乎总是​​形式为"<item title> (app name)",这不太有用。如何在不破解字符串的情况下仅获取项目标题本身而没有应用程序名称?

4

7 回答 7

19

就是这样。我的意思是即使我不喜欢它,显然用户知道他是从应用程序购买的,但我认为谷歌只会以这种方式回复它

于 2013-11-15T18:39:14.997 回答
10

由于没有人回复实际的正则表达式模式以匹配 SKU 标题括号中的应用程序名称,我想我只是在这里发布代码以供进一步参考:

// matches the last text surrounded by parentheses at the end of the SKU title
val skuTitleAppNameRegex = """(?> \(.+?\))$""".toRegex()

val titleWithoutAppName = skuDetails.title.replace(skuTitleAppNameRegex, "")

正则表达式尽可能严格,以允许您的 SKU 标题中的括号中添加额外的文本,而无需删除它(例如,像Premium(订阅)这样的 SKU 标题将保持原样)。您唯一应该避免的是应用名称中的括号,但是通过对正则表达式进行一些调整,您也可以解决这个问题。

众所周知,正则表达式的构建成本很高,因此建议将其存储在一个字段中,并避免在每次解析 SKU 时都构建它们。

于 2019-10-16T09:41:46.807 回答
3

将@ubuntudroid的答案改编为 Java,我让它像这样工作:

String skuTitleAppNameRegex = "(?> \\(.+?\\))$";
Pattern p = Pattern.compile(skuTitleAppNameRegex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(skuDetails.getTitle());
String titleWithoutAppName = m.replaceAll("");
于 2019-12-29T15:24:23.423 回答
1
String productTitleWithAppName=skuDetails.getTitle();

String productTitleWithoutAppName = productTitleWithAppName.substring(0, productTitleWithAppName.indexOf("("));
于 2020-05-15T17:28:49.527 回答
0

您不需要为此使用正则表达式。以下应该工作。这是在 C# 中,但您可以猜到如何使用 Java 或任何其他语言来实现。

string title = getTitle(); // get title
int appNameStartIndex = title.LastIndexOf("("); // find last index of (.
string titleWithoutAppName = title.Substring(0, appNameStartIndex); // and :)
于 2021-05-04T10:07:09.733 回答
0

实际上,括号中不带app名称的SKU名称是与SKU一起传输的,但是没有getter来检索它。

如果您对类的实现有更深入的了解SkuDetails,那么您会看到,整个事情都是基于一个 json 字符串(调试也为您提供了这个 json)。
而这个 json 字符串不仅包含带有应用名称的标题,还包含一个仅包含 SKU 名称的名称字段。

SKU 的 json 表示可以使用SkuDetails.getOriginalJson().

因此,如果它更符合您的需求,那么您当然可以直接从 Google 返回的数据中检索 SKU 名称。

于 2021-11-18T11:33:24.833 回答
0

我发现在开发版本中,我会得到一个像My product (com.test.myapp (unreviewed)). 这是处理嵌套括号并保持产品名称中其他括号完整的正则表达式版本:

const removeAppNameFromProductTitle = (title: string) => {
  const regex = /( \([^()]*\)$)|( \([^)]*\)\)$)/im;
  return title.replace(regex, '');
};

代码在 TypeScript (React Native) 中,但我相信你可以适应。这是测试用例的要点:https ://gist.github.com/thmsobrmlr/732ecf958f600ec38e89c4e8ff57f3dd 。

于 2022-02-12T16:08:07.850 回答