有没有一种方法可以在不使用自定义代码的情况下删除前导和尾随子字符串?

问题描述 投票:0回答:1

您可以在不使用正则表达式和/或自定义代码的情况下从字符串中删除前导和滞后字符和子字符串吗?

例如,我想删除前导

https://
和滞后
/
(反斜杠)。

我绝对可以使用自定义代码和/或正则表达式来解决这个问题。 但我们不想在讨论后继续给出这些答案。 很多人对这个变化并不确定,也不想花时间学习RegEx来验证。 我们只是想让重构后切换和验证是否正常工作变得简单。 是否有一个包解决方案或内置程序已经处理查找替换第一个和最后一个?

@Value("${elsewhere.host.url:https://url.or.uri.full.or.partial}")
String urlOrUri;

// ...

String scheme = "https://"

// Example 1: 
if (urlOrUri.startsWith(scheme))
    urlOrUri.replaceFirst(scheme,"");
if (urlOrUri.startsWith("/"))
    urlOrUri.replaceFirst("/","");
if (urlOrUri.endsWith("/"))
    urlOrUri.replaceFirst("/","");

// Example 2:
urlOrUri.replace("^https://+", "");
urlOrUri.replace("^/+", "")
urlOrUri.replace("\/+$", "")

https://regex101.com/

replace spring-annotations string-parsing formatter regex-replace
1个回答
0
投票

“自定义代码”有什么问题?您编写的所有内容都是自定义代码。

而不是重复

if (urlOrUri.startsWith(scheme))
    urlOrUri.replaceFirst(scheme,"");

写一个方法。如果您使用

.substring
而不是
replaceFirst
,则不会出现任何“重新匹配”:

public String removePrefix(String input, String prefix) {
  if (input.startsWith(prefix)) {
     return input.substring(prefix.length());
  }
  return input;
}

此外,关于您在此处使用正则表达式的方式,没有太多需要了解的内容,除了您使用的正则表达式与示例 1 的作用不同:

removePrefix("//example", "/"); // Returns "/example"
"//example".replace("^/+", ""); // Returns "example"

即使您使用正则表达式,您也应该编写一个方法来执行此操作,而不是单独编写每个正则表达式:

public String removePrefix(String input, String prefix) {
  return input.replace("^" + Pattern.quote(prefix), "");
}

还有一点:由于您正在使用 URL/URI,也许您可以使用 URL 解析器库,但这取决于您这样做的原因以及您实际上要实现的目标。

© www.soinside.com 2019 - 2024. All rights reserved.