如何在此作业中将字符串拆分为列表?JAVA

如何在此作业中将字符串拆分为列表?JAVA,java,regex,Java,Regex,我有一根这样的绳子。 <body> Search Results: <br> <br> Member ID: 10149 <br> Title: <br> First Name: Skye <br> Middle Name: Susan <br> Last Name: Sommers <br> Comment:

我有一根这样的绳子。

<body>
Search Results:
<br>
<br>

    Member ID: 10149
    <br>
    Title:
    <br>
    First Name: Skye
    <br>
    Middle Name: Susan
    <br>
    Last Name: Sommers
    <br>
    Comment: Entry Report completed.
    <br>
    Time Stamp: 2011-10-13 14:43:36
    <br>
    Select Agent: Century 21
    <br>
    Agent Details: Peter Thorpe Century 21 33 Diamond Drive Newcastle NSW 2300
    <br>
    Street: 49 Fairway Court
    <br>
    Suburb: Newcastle
    <br>
    Postcode: 2300
    <br>
    <br>
    Member ID: 10149
    <br>
    Title:
    <br>
    First Name: Skye
    <br>
    Middle Name:
    <br>
    Last Name: Sommers
    <br>
    Comment: Qtr inpection showed residence in very good condition. Walls and floors very clean. Back and front yard both neatly kept.
    <br>
    Time Stamp: 2011-10-13 12:40:31
    <br>
    Select Agent: Century 21
    <br>
    Agent Details: Peter Thorpe Century 21 33 Diamond Drive Newcastle NSW 2300
    <br>
    Street: 49 Fairway Court
    <br>
    Suburb: Newcastle
    <br>
    Postcode: 2300

谢谢你的帮助

由于潜在的冲突,这很难快速完成。您可以使用
String.replace()
删除

标记。然后你可以对单词“Member”执行
String.split()


一种更受控制但复杂的方法是,在换行符上拆分()
,然后读取每一行,检查是否有
startsWith()
,然后填写适当的数据。考虑到上面的结果没有多大帮助,这还允许您实际创建一个
记录
对象,并逐行填充它。

我要做的是这个伪代码:

Member newMember = null;
List<Member> result = new ArrayList<Member>();

for each line
   trim whitespace
   // control new objects
   if line starts with "Member ID:"
      if newMember != null
          result.add(newMember);
      newMember = new Member()

   // add values to the current object
   else if newMember != null (at the beginning there's no created object)
      if line starts with "field1:"
         newMember.setField1(parse value from line)
      else if line starts with "field2:"
         newMember.setField2(parse value from line)
成员newMember=null;
列表结果=新建ArrayList();
每行
修剪空白
//控制新对象
如果行以“成员ID:”开头:
如果是新成员!=无效的
结果。添加(新成员);
newMember=新成员()
//向当前对象添加值
如果是新成员,则为其他!=null(开始时没有创建对象)
如果行以“field1:”开头:
setField1(解析第行中的值)
否则,如果行以“field2:”开头:
setField2(从第行解析值)

如果您的输入格式正确,它就足够了。

您的元素顺序没有改变,但是您希望创建一个bean的
列表。
我可以建议在这种情况下改用吗?它们是可以使用
bean.get(“key”)动态创建并访问值的对象bean.set(“key”,“value”)设置值

因此,您可以使用以下方法拆分html:

String html = "<your html>";
List l = new ListArray();
int index = 0;
while((index = html.indexOf("Member", index)) > -1) {
   //nextIndex is the end of the first element.
   int nextIndex = html.indexOf("<br>\n<br>",index);
   String element = html.substring(index, nextIndex);
   //parse element string to create dynabeans
   DynaBean bean = createDynaBean(element);
   l.add(bean);
   index = nextIndex;

}
String html=”“;
列表l=新的ListArray();
int指数=0;
而((index=html.indexOf(“成员”,index))>-1){
//nextIndex是第一个元素的结尾。
int-nextIndex=html.indexOf(“
\n
”,索引); String元素=html.substring(index,nextIndex); //解析元素字符串以创建dynabeans DynaBean=createDynaBean(元素); l、 添加(bean); 指数=nextIndex; }
我没有提供创建dynabean的代码。请看这里的示例,了解如何使用。由于在
列表中有一个字符串预先表示1个元素
,因此应该很容易使用
split()
indexOf()
等来获取所需元素的值。我将首先在
\n
上拆分,然后在
上拆分,这将为每行提供键和值


希望这能有所帮助。

这里有一个简单的解决方案:

String[] parts = input.split("(?m)\\s*(^.*<.*$)+\\s*");
迭代它,忽略你不想要的东西。假设“搜索结果:”标记了一个新人,请执行以下操作:

List<Map<String, String>> peopleList = new ArrayList<Map<String, String>>();
Map<String, String> person = null;
for (String part : parts) {
    if (!part.contains(":") || person == null) continue;
    if (parts.startsWith("Search Results")) {
        person = new HashMap<String, String>();
        peopleList.add(person);
        continue;
    }
    String[] nameValue = part.trim().split(":");
    person.put(nameValue[0].trim(), nameValue[1].trim());
}
List peopleList=new ArrayList();
Map person=null;
用于(字符串部分:部分){
如果(!part.contains(“:”)| person==null)继续;
if(parts.startsWith(“搜索结果”)){
person=newhashmap();
人员列表。添加(个人);
继续;
}
字符串[]nameValue=part.trim().split(“:”);
person.put(nameValue[0].trim(),nameValue[1].trim());
}

现在您有了一个地图列表,每个地图都有“Member ID”=“10149”等条目

我会这样做:

// remove spaces and tags
html = html.replaceAll("(?m)(<.*?>|Search Results:|^ *)", "");
// remove empty lines
html = html.replaceAll("(?m)^[ \t]*\r?\n", "");
// split by newlines
String[] results = html.split("\\n")
// use results
//删除空格和标记
html=html.replaceAll((?m)(|搜索结果:|^*),“”);
//删除空行
html=html.replaceAll(“(?m)^[\t]*\r?\n”,”);
//按换行符拆分
字符串[]结果=html.split(\\n)
//使用结果

然后,您可以使用
拆分每个
结果[i]
,以获得键和值。

首先根据

\n
进行拆分,然后使用

字符拆分数组[1]元素,然后对所有拆分的字符串进行迭代,然后执行任何您想要的操作

请你重新格式化一下你的问题好吗:不清楚你想做什么(你是用HTML输入的,还是用HTML在这里格式化的?)。另外,你也可以发布你自己尝试过的东西,并解释失败的原因吗?谢谢。到目前为止你都试了些什么?你有什么想法?首先,你应该考虑一下要遵循的程序。举例来说,开始阅读每一行,为每一行确定它是哪个字段,将它添加到一些时间结构中,然后继续。决定何时必须生成新成员(例如,在找到成员id字段时)。然后,如果你在做一些事情(分割行、删除空白、迭代等)时遇到困难,可以发布一个更具体的问题
List<Map<String, String>> peopleList = new ArrayList<Map<String, String>>();
Map<String, String> person = null;
for (String part : parts) {
    if (!part.contains(":") || person == null) continue;
    if (parts.startsWith("Search Results")) {
        person = new HashMap<String, String>();
        peopleList.add(person);
        continue;
    }
    String[] nameValue = part.trim().split(":");
    person.put(nameValue[0].trim(), nameValue[1].trim());
}
// remove spaces and tags
html = html.replaceAll("(?m)(<.*?>|Search Results:|^ *)", "");
// remove empty lines
html = html.replaceAll("(?m)^[ \t]*\r?\n", "");
// split by newlines
String[] results = html.split("\\n")
// use results