java以空格为分隔标记取子字符串问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java以空格为分隔标记取子字符串问题相关的知识,希望对你有一定的参考价值。

通过out.readLine()取得txt文件一行字符串 s="user1 123 Alice Seller 1" 时,怎样取其中子字符串“user1” ,“123”, "Alice" ,“Seller”, “1” 分别赋值给其对应变量 id , password, name, job, level

string str[]=s.spilt(" ");先把字符串断开为数组然后取值就是了。取值的时候可以判断一下如果值不为空再赋值,可以避免子字符串里面有两个及其以上的空格。 参考技术A 字符串之间空格有几个?
public static void main(String[]args)
String s = "user1 123 Alice Seller 1";
String[] arrays = s.split(" ");
String id = arrays[0];
String password = arrays[1];
String name = arrays[2];
String job = arrays[3];
String level = arrays[4];
System.out.println("id: " +id);
System.out.println("password: " +password);
System.out.println("name: " +name);
System.out.println("job: " +job);
System.out.println("level: " +level);
追问

原来是正则表达式拆分,split()参数中空格数竟然有严格规定,难怪之前取不了数据

本回答被提问者采纳

子字符串和分隔符

【中文标题】子字符串和分隔符【英文标题】:Sub-strings and delimiters 【发布时间】:2018-03-05 21:26:15 【问题描述】:

我正在尝试获取由某些字符(空格、逗号或点)分隔的句子,以检查它是否是回文。如果输入是“hello,p​​otato.”,我将只检查“hello”的对称性,然后只检查土豆。

问题是,当我在循环的第一次迭代中搜索分隔符时,单词“hello”存储在子句中,但在第二次迭代中,单词应该存储为“土豆”将是“土豆。”。而且我无法删除“。”输入字符串末尾的分隔符。

for(int i=0;i<sentence.length();i++)
      
        if(sentence[i]==' '||sentence[i]=='.'||sentence[i]==',')
         //the couts is just to help me debug/trace
                cout<<"i is now : "<<i<<endl;
                if(i==delindex && i==sentence.length()-1)
                
                 subsentence=sentence.substr(temp+1,subsentence.length()-1);
                
                else
                
                    subsentence=sentence.substr(delindex,i);
                    cout<<subsentence<<endl;
                    temp=delindex-1;
                    delindex=i+1;
                
        
      

最好的方法是什么?

【问题讨论】:

@JCollier 像马铃薯一样。最后有一个点(分隔符)我想要没有点 虽然有一种非常简单的方法可以使用.begin().rbegin() 来推断回文,但解析多个分隔符仍然最好由strtok 处理,由&lt;cstring&gt; 提供。 getline 允许使用结束分隔符,但不允许使用多个分隔符。 @DavidC.Rankin 上帝保佑你,我一直在寻找 strtok 这是自切片面包以来最伟大的事情,用于标记字符串(在 &lt;cstring&gt; 标头中可以找到许多在 C++ 中没有直接对应类的块)跨度> 【参考方案1】:

上帝保佑你,我一直在寻找 strtok

实际上,您不需要strtok(出于各种安全原因可能应该避免使用它),因为std::string 有一个名为find_first_of 的绝妙方法,它的作用非常类似于strtok,因为它接受一堆字符并在偶然发现任何字符时返回索引。然而,在这种情况下,find_first_of 和 find_first_not_of 的组合更适合制作健壮的标记器。

因此,您可以将令牌搜索简化为:

#include <iostream> 
#include <string>

int main()

    std::string sentence = "hello,potato tomato.";
    std::string delims = " .,";

    size_t beg, pos = 0;
    while ((beg = sentence.find_first_not_of(delims, pos)) != std::string::npos)
    
        pos = sentence.find_first_of(delims, beg + 1);
        std::cout << sentence.substr(beg, pos - beg) << std::endl;
    

https://ideone.com/rhMyvG

【讨论】:

以上是关于java以空格为分隔标记取子字符串问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用扫描仪在hackerrank中输入以空格分隔的字符

从字符串中以空格分隔和引号括起来的元素获取数据字段

将带有空格分隔符的字符串转换为数组。并输出这个数组,就像一个字符串

Java 以空格分割字符串

从list列表中以空格读取字符串 .java

java 截取一空格为分隔符的字符串