【问题标题】:Is there a strpbrk equivalent in Java? and how to use it?Java中是否有strpbrk等价物?以及如何使用它?
【发布时间】:2018-11-02 16:10:31
【问题描述】:

如果代码是这样的

const char str1[] = "abcde2fghi3jk4l";
const char str2[] = "34";
char *ret;
ret = strpbrk(str1, str2);

我应该如何在 Java 中复制相同的内容?

【问题讨论】:

  • 添加预期结果可能会有所帮助
  • @jhamon ret 是一个指针,指向 str1 中第一次出现的属于 str2 的任何字符。
  • 护目镜java find string in string
  • 请添加预期结果,现在您的问题需要有人离开网站才能弄清楚strpbrk() 做了什么

标签: java c string


【解决方案1】:

java 中没有直接的等价物。

一种可能的解决方案是使用PatternMatcher

java.util.regex.Pattern
java.util.regex.Matcher

var str1 = "abcde2fghi3jk4l";
var str2 = Pattern.quote("34");

Matcher m = Pattern.compile("["+str2+"]").matcher(str1);
if ( m.find() )
  return m.start();
return -1;

【讨论】:

  • 我使用了问题中给出的示例信息,我相信用户将能够预测出真正生产解决方案所需的字符检查。
【解决方案2】:

没有使用标准 API 的直接等价物。

第一个解决方案:使用Apache StringUtils library: indexOfAny()

ret = StringUtils.indexOfAny(str2,str1.toCharArray());

第二种解决方案:使用标准 Java 8 API,这很冗长

    String str1 = "abcde2fghi3jk4l";
    String str2 = "34";
    OptionalInt ret = str2.chars().map(c -> str1.indexOf(c)).min();

第三种解决方案:使用正则表达式,但 str1 不应包含任何正则表达式特殊字符,所以我不推荐它...

Matcher matcher = str2.matcher("["+str1+"]");
if(matcher.find()){
    ret = matcher.start();
}

【讨论】:

    【解决方案3】:

    首先,Java 不是 C,它没有与 C 相同的指针。

    我能想到的最接近您的代码的是:

    final String str1 = "abcde2fghi3jk4l";
    final String str2 = "34";
    StringTokenizer st = new StringTokenizer(str1, str2);
    String ret = st.hasMoreTokens() ? str1.substring(st.nextToken().length()) : null;
    

    此代码使用 JRE 附带的 java.util.StringTokenizer

    你可以自己试试here

    【讨论】:

      【解决方案4】:

      有这个功能: StringUtils.indexOfAny(String str, String searchChars) 将返回来自searchChars 的第一个匹配字符的索引。希望这就是你要找的。 这是一种相当昂贵的方法,看看您是否可以使用更好的方法。

      依赖是org.apache.commons:commons-lang3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        • 2011-01-17
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多