【问题标题】:replacing/ignoring punctuation in string java替换/忽略字符串java中的标点符号
【发布时间】:2012-07-14 13:48:04
【问题描述】:

所以基本上对于我的 uni 工作,我必须创建一个小程序,为特定句子提供单词模式,即“我是男人”会给出 2、1、1,因为有 2 1 个字母单词,1 2字母词和 1 个 3 字母词。更难的部分(至少对我来说)是我必须排除所有标点符号,例如 i,我会以 2 的形式出现,因为逗号应该被排除在字符之外。

我的讲师说这段代码应该可以工作 str = str.replaceAll("[^A-Za-z]", ""); 但问题是我不知道如何将它集成到我的小程序中,花了很长时间看它。这基本上是小程序的最后一部分(这加上一个图表)。希望你明白我的意思,如果你能帮助我,将不胜感激。顺便说一句,我实际上还没有学过 str.replace。

这是我到目前为止所拥有的(希望我正确地输入了)

import java.util.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class clarke_j_reass  extends Applet implements ActionListener
{
    Button pr_input1, pr_input2;

    Label pr_label;
    TextField pr_text;
    String pr_name;

    public void init()

    {
        pr_input1 = new Button("Analyze");
        pr_input2 = new Button("Reset");
        add(pr_input1);
        add(pr_input2);
        pr_input1.addActionListener(this);
        pr_input2.addActionListener(this);
        //add the buttons with action listeners
        pr_label = new Label("Word Pattern");
        add(pr_label);
        pr_text = new TextField();
        add(pr_text);
        pr_text.addActionListener(this);
        //add text field
    }    
    public void start()
    {           
        pr_name="";
            setSize(400,400);
            setBackground(Color.gray);
        pr_text.setBackground(Color.white);      
    }

    public void actionPerformed(ActionEvent e){


    pr_name = e.getActionCommand();
    repaint();
        if(e.getSource() == pr_input1)
            pr_name = pr_text.getText();
        else
            if(e.getSource() == pr_input2)
            {   pr_name = "";        
                pr_text.setText("");
                }
         repaint();
             // The user's input from the text area.                     
            int pr_char;

           String array[]=pr_name.split(" ");
           int counter=0;
           for(int i=0;i<array.length;i++)
               if(counter<array[i].length())
                   counter=array[i].length();
           int intArray[]=new int[counter];
           for(int i=0;i<intArray.length;i++){
               intArray[i]=0;
           }
           for(int i=0;i<array.length;i++){
               intArray[array[i].length()-1]++;
           }
           String a="";
           for(int i=0;i<intArray.length;i++){
               if(intArray[i]>0)
               {
                a+=String.valueOf(intArray[i]);
                a+=", ";
               }
           }
           pr_label.setText(a);


           pr_char = pr_name.length(); 
    }

    public void paint(Graphics g)
    {
  //      g.setColor(pr_col);
     //   g.drawString(pr_name,0,250);
      pr_text.setSize(400, 200);
      pr_text.setLocation(0,0);
      pr_input1.setLocation(150,220);
      pr_input2.setLocation(200,220);
      pr_label.setLocation(0,270);
      pr_label.setSize(400,30);
    }
}

空格不是问题,因为代码不包含它们,我只查找单词。我现在遇到的问题是,当我将代码放在我被告知的位置时,它并没有给我正确的模式,而是将其限制为 1。即我是一个男人出来 1,而不是 2、1、1,

【问题讨论】:

  • 在拆分成单词之前,应用您的讲师给pr_name的行。
  • @rsp:那会让拆分变得非常困难,不是吗?
  • “在旁注中,我实际上还没有被教过 str.replace。”你应该等待被教导吗?
  • 您的输入会是什么样子?您可以期待什么样的分隔符?
  • @Keppil,而不是当您在正则表达式的字符集中添加空格字符时,我不会超出大学学生的范围。

标签: java arrays string replace


【解决方案1】:

把你的导师的建议放在上面:

String array[]=pr_name.split(" ");

您似乎将文本字符串存储为 pr_name,因此在拆分空格之前,您可以删除其他字符。它应该是这样的:

pr_name = pr_name.replaceAll("[^a-zA-Z\s:]", "");
String array[]=pr_name.split(" ");

【讨论】:

  • 正如我上面评论的那样,您不能删除所有空格(和其他非字母),然后按空格分割。
  • 这将删除所有的空格。
  • 所以更改正则表达式使其工作。我在上面进行了编辑,也忽略了空格。不要急于投票,因为问题是如何合并教授的代码以及我指示使用教授代码的位置是正确的。教授的正则表达式有误,但可以将 \s 添加到其中,然后它将忽略 alpha 和空格。如果您还想包含受保护的数字,请像这样添加 \d: [^a-zA-Z\d\s:]
【解决方案2】:

替换

for(int i=0;i<array.length;i++){
   intArray[array[i].length()-1]++;
}

for(int i=0;i<array.length;i++){
   intArray[array[i].replaceAll("[^A-Za-z]", "").length()-1]++;
}

【讨论】:

    【解决方案3】:

    这是正则表达式的示例。 replaceAll 调用中的第一个字符串定义了它正在寻找的模式。

    在这种情况下,“^”字符表示“not”,“A-Za-z”表示所有大写和小写字母。所以整体模式意味着,任何不是字母的东西。如果你想在空格上分割,那是错误的模式,所以你还必须添加“\s”来包含空格字符。因此,调用:

    str = str.replaceAll("[^A-Za-z\s]", "")
    

    将用空字符串替换任何不是字母或空白字符的内容。

    在您的程序中,您将在进行字符串处理之前插入此调用。像这样:

    pr_name = pr_name.replaceAll("[^A-Za-z\s]", "")
    String array[]=pr_name.split(" ");
    

    【讨论】:

    • 这将删除所有的空格。
    • 哦,是的。不好意思,只是拿了他原来的图案。我会解决的。
    • 我认为这个答案需要深入了解正则表达式的工作原理,而原始海报似乎没有。
    • 这不是一个不合理的观点,但如果他需要进一步改变模式,它真的只需要了解正则表达式。考虑到他已经在尝试使用 String.replaceAll,根据他老师的建议,在模式中添加空格代码并没有太大的区别。
    【解决方案4】:

    length 定义为:

    int length = array[i].replaceAll("[^A-Za-z]", "").length();
    

    替换:

           for(int i=0;i<array.length;i++)
               if(counter<array[i].length())
                   counter=array[i].length();
    

    与:

           for(int i=0;i<array.length;i++) {
               int length = array[i].replaceAll("[^A-Za-z]", "").length();
               if(counter<length)
                   counter=length;
           }
    

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多