1,105,352 Community Members

How do I ignore case, spaces and punctuation

Member Avatar
jems5
Junior Poster in Training
61 posts since Sep 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

I am writing a program that reads text but must ignore case, spaces and punctuation while evaluating a string for palindrome. When I use the following the case issue is solved.

String str = "";
if (str.toLowerCase().charAt(LHS) != str.toLowerCase().charAt(RHS))

...but when I use the following I get IndexOutOfBoundsException error can anyone explain why?

String str = "";
if (str.toLowerCase().replaceAll("\\w", "").charAt(LHS) != str.toLowerCase().replaceAll("\\w", "").charAt(RHS))
Member Avatar
BestJewSinceJC
Posting Maven
2,760 posts since Sep 2008
Reputation Points: 700 [?]
Q&As Helped to Solve: 366 [?]
Skill Endorsements: 17 [?]
 
0
 

In your new String, either "LHS" or "RHS" represents an Index which is no longer valid. Since replacing whitespace with "" makes your string shorter, your index is no longer valid in the new string. In your new string, which is shorter than the old string, more than likely the "RHS" is greater than the highest index

edit:

to add to that, the above is the reason why you should really be making a custom method which simply goes character by character through your string and ignores whitespace. The replaceAll technique isn't bad, but after you do that, you should use a for loop to check the two strings to see if they're the same.

Member Avatar
jems5
Junior Poster in Training
61 posts since Sep 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

In your new String, either "LHS" or "RHS" represents an Index which is no longer valid. Since replacing whitespace with "" makes your string shorter, your index is no longer valid in the new string. In your new string, which is shorter than the old string, more than likely the "RHS" is greater than the highest index.

I thought I was simply setting conditions on a string on both sides of the equal sign but I was wrong. Any thoughts on how to apply removing whitespace and punctuations? Also I need to consider both whitespaces and punctuations.

Member Avatar
BestJewSinceJC
Posting Maven
2,760 posts since Sep 2008
Reputation Points: 700 [?]
Q&As Helped to Solve: 366 [?]
Skill Endorsements: 17 [?]
 
0
 

What you did by calling replaceAll is construct a new String with all of the whitespace removed. The returned String was smaller than your original String, hence when you used the original index, it was larger than the size of the String. In my first post I gave a suggestion: use replaceAll (like you used it) to remove the whitespace. Then use a loop to check the strings to see if they're palindromes. Simple if statements can ignore punctuation ..

Member Avatar
jems5
Junior Poster in Training
61 posts since Sep 2010
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

What you did by calling replaceAll is construct a new String with all of the whitespace removed. The returned String was smaller than your original String, hence when you used the original index, it was larger than the size of the String. In my first post I gave a suggestion: use replaceAll (like you used it) to remove the whitespace. Then use a loop to check the strings to see if they're palindromes. Simple if statements can ignore punctuation ..

I did two things, I did as you suggested and I got the result I needed (in terms of whether or not the string is palindrome). While doing so joined all the characters, I really need to check its condition for these specifications. Secondly, I am trying the long way to just check the condition. While the program compiled and produced a result it did not appear to have an impact. Can you critique please.

// Recursive method   
      public static String isPalindrome(String str) {
         int LHS = 0;                              // the first char of string
         int RHS = str.length() -1;                // the last char of string
         while (LHS < RHS) {                       // continue until they reach center
         // consider case sensitive inputs and converts to one case type
            //if (str.toLowerCase().charAt(LHS) != str.toLowerCase().charAt(RHS))
if(!(Character.isDigit(str.toLowerCase().charAt(LHS)) || Character.isLetter(str.toLowerCase().charAt(LHS))) !=
!(Character.isDigit(str.toLowerCase().charAt(RHS)) || Character.isLetter(str.toLowerCase().charAt(RHS))))
               return palindromeNo;
            LHS++;                                 // index toward the center of string from LHS
            RHS--;                                 // decrement toward the center from RHS
         }
         return palindromeYes;
      }
Question Answered as of 3 Years Ago by BestJewSinceJC
You
This question has already been solved: Start a new discussion instead
Post:
Start New Discussion
Tags Related to this Article