I am trying to remove full stops from a String. I have tried the below
titleAndBodyContainer = titleAndBodyContainer.replaceAll("\\.", " ");
Unfortunately, this removed all other 'dots' as well. My paragraph includes dates like Jan.13, 2014 , words like U.S and numbers like 2.2. How can I remove only the full stops?
I'd do:
titleAndBodyContainer = titleAndBodyContainer.replaceAll("\\.(?=\\s|$)", " ");
If your strings (sentences) are grammatically correct i.e. a sentence following the fullstop starts with a capital letter I think you can create a custom method to check for such fullstop if after the fullstop there is a string having its first letter capitalized.
You can check if any space or newline coming after . .
You can use the regex : (\.(?=[\s\n\r]|$))
Code :
String input = "Unfortunately, this removed all other 'dots' as well. My paragraph includes dates like Jan.13, 2014 , words like U.S and numbers like 2.2. How can I remove only the full stops?\n"+"Somthing is there.\n"+"Hello someone . What is this something ? ";
String REGEX = "(\\.(?=[\\s\\n\\r]|$))";
String x=input.replaceAll(REGEX, " ");
OUTPUT
Unfortunately, this removed all other 'dots' as well My paragraph includes dates like Jan.13, 2014 , words like U.S and numbers like 2.2 How can I remove only the full stops?
Somthing is there
Hello someone What is this something ?
DEMO
Related
I am working on a project for a beginners java course, I need to read a file and turn each line into an object, which i will eventually print out as a job listing. (please no ArrayList suggestions)
so far i have gotten that file saved into a String[], which contains strings like this:
*"iOS/Android Mobile App Developer - Java, Swift","Freshop, Inc.","$88,000 - $103,000 a year"
"Security Engineer - Offensive Security","Indeed","$104,000 - $130,000 a year"
"Front End Developer - CSS/HTML/Vue","HiddenLevers","$80,000 - $130,000 a year"*
what im having trouble with is trying to split each string into its three parts so it can be inputted into my JobService createJob method which is as shown:
public Job createJob(String[] Arrs) {
Job job = new Job();
job.setTitle(Arrs[0]);
job.setCompany(Arrs[1]);
job.setCompensation(Arrs[2]);
return job;
}
I am terrible at regex but know that trying to .split(",") will break up the salary portion as well. if anyone could help figure out a reliable way to split these strings to fit into my method i would be grateful!!!
Also im super new, please use language the commoners like me will understand...
You need a slightly better split criteria, something like \"," for example...
String text = "\"iOS/Android Mobile App Developer - Java, Swift\",\"Freshop, Inc.\",\"$88,000 - $103,000 a year\"";
String[] parts = text.split("\",");
for (String part : parts) {
System.out.println(part);
}
Which prints...
"iOS/Android Mobile App Developer - Java, Swift
"Freshop, Inc.
"$88,000 - $103,000 a year"
Now, if you want to remove the quotes, you can do something like....
String text = "\"iOS/Android Mobile App Developer - Java, Swift\",\"Freshop, Inc.\",\"$88,000 - $103,000 a year\"";
String[] parts = text.split("\",");
for (String part : parts) {
System.out.println(part.replace("\"", ""));
}
Regular Expression
No, I'm not that good at it either. I tried...
String[] parts = text.split("^\"|\",\"|\"$");
And while this works, it produces 4 elements, not 3 (first match is blank).
You could remove the first and trailing quotes and then just use "," instead...
text = text.substring(1, text.length() - 2);
String[] parts = text.split("\",\"");
trim leading and trailing quotes
split on ","
As code:
String[] columns = line.replaceAll("^\"|\"$", "").split("\",\"");
^"|"$ means "a quote at start or a quote at end"
The regex for the split is just a literal ","
I have echo $result in PHP code and I am printing the result to a textview and I want to display it in multiline but I get this in the textView
Available articles: 28
---------------------------------------
number of clients: 23
Top solded Articles and its beneficient:
Muffin Mix - Lemon Cranberry:161.41
Mushrooms - Black, Dried:148.62
Amaretto:134.01
Longos - Grilled Veg Sandwiches:122.89
Here is my android code
public void processFinish(String output) {
TextView reprttxt = (TextView)findViewById(R.id.reprttxt);
output.replace("\\n",System.getProperty("line.separator"));
reprttxt.setText(output);
}
Notice that I tried output.replace("\\n",System.getProperty("line.separator")); and output.replace("\\\n",System.getProperty("line.separator")); but it doesn't work. How to solve that by modifying the Android Java code or the PHP code?
Use a CharSquence instead of a String for output. TextView.setText() doesn't like String text that contains special characters it will either strip it or display it weirdly depending on the circumstance CharSquence doesn't have this problem.
According to this doc you have to set a property like android:maxLines="2". You can set any value you like. Then '\n' should work as you expected.
The string doesn't have a real embedded newline '\n' character. It has a "\\n" substring- an actual backslash followed by an n. The correct way to fix this is by fixing the server- it shouldn't be sending the data like this. If you need a hack, replace "\\n", not "\n"
You can tell this is the case by the fact a \n is in the actual output. If it was just the wrong type of separator, it would either be whitespace or ignored instead. BTW, on Android the line separator is '\n' as it is on all Linux based systems.
public void processFinish(String output) {
TextView reprttxt = (TextView)findViewById(R.id.reprttxt);
reprttxt.setText(Html.fromHtml(output));
}
example : output = "this is \n two line";
Input -
String ipXmlString = "<root>"
+ "<accntNoGrp><accntNo>1234567</accntNo></accntNoGrp>"
+ "<accntNoGrp><accntNo>6663823</accntNo></accntNoGrp>"
+ "</root>";
Tried follwing things using to mask values within using
String op = ipXmlString .replaceAll("<accntNo>(.+?)</accntNo>", "######");
But above code masks all the values
<root><accntNoGrp>######</accntNoGrp><accntNoGrp>######</accntNoGrp></root>
Expected Output:
<root><accntNoGrp><accntNo>#####67</accntNo></accntNoGrp><accntNoGrp><accntNo>#####23</accntNo></accntNoGrp></root>
How to achieve this using java regex ?Could someone help
Your replacement is wrong, you need to include the <accntNo> tag in the actual replacement. Also, it appears that you want to show the last two characters/numbers of the account number. In this case, we can capture this information during the match and use it in the replacement.
Code:
String op = ipXmlString.replaceAll("<accntNo>(?:.+?)(.{2})</accntNo>", "<accntNo>######$1</accntNo>");
Explanation:
<accntNo> match an opening tag
(?:.+?) match, but do not capture, anything up until the first
(.{2}) two characters before closing tag (and capture this)
</accntNo> match a closing tag
Note here that by using ?: inside a parenthesis in the pattern, we tell the regex engine to not capture it. There is no point in capturing anything before the last two characters of the account number because we don't want to us it.
The $1 quantity in the replacement refers to the first capture group. In this case, it is the last two characters of the account number. Hence, we build the replacement string you want this way.
Demo here:
Rextester
Try this code:
public static void main(String[] args) {
String ipXmlString = "<root>"
+ "<accntNoGrp><accntNo>1234567</accntNo></accntNoGrp>"
+ "<accntNoGrp><accntNo>6663823</accntNo></accntNoGrp>"
+ "</root>";
String replaceAll = ipXmlString.replaceAll("\\d+", "######");
System.out.println(replaceAll);
}
Prints:
<root><accntNoGrp><accntNo>######</accntNo></accntNoGrp><accntNoGrp><accntNo>######</accntNo></accntNoGrp></root>
Does Java have a built-in way to escape arbitrary text so that it can be included in a regular expression? For example, if my users enter "$5", I'd like to match that exactly rather than a "5" after the end of input.
Since Java 1.5, yes:
Pattern.quote("$5");
Difference between Pattern.quote and Matcher.quoteReplacement was not clear to me before I saw following example
s.replaceFirst(Pattern.quote("text to replace"),
Matcher.quoteReplacement("replacement text"));
It may be too late to respond, but you can also use Pattern.LITERAL, which would ignore all special characters while formatting:
Pattern.compile(textToFormat, Pattern.LITERAL);
I think what you're after is \Q$5\E. Also see Pattern.quote(s) introduced in Java5.
See Pattern javadoc for details.
First off, if
you use replaceAll()
you DON'T use Matcher.quoteReplacement()
the text to be substituted in includes a $1
it won't put a 1 at the end. It will look at the search regex for the first matching group and sub THAT in. That's what $1, $2 or $3 means in the replacement text: matching groups from the search pattern.
I frequently plug long strings of text into .properties files, then generate email subjects and bodies from those. Indeed, this appears to be the default way to do i18n in Spring Framework. I put XML tags, as placeholders, into the strings and I use replaceAll() to replace the XML tags with the values at runtime.
I ran into an issue where a user input a dollars-and-cents figure, with a dollar sign. replaceAll() choked on it, with the following showing up in a stracktrace:
java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
In this case, the user had entered "$3" somewhere in their input and replaceAll() went looking in the search regex for the third matching group, didn't find one, and puked.
Given:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
replacing
msg = msg.replaceAll("<userInput \\/>", userInput);
with
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
solved the problem. The user could put in any kind of characters, including dollar signs, without issue. It behaved exactly the way you would expect.
To have protected pattern you may replace all symbols with "\\\\", except digits and letters. And after that you can put in that protected pattern your special symbols to make this pattern working not like stupid quoted text, but really like a patten, but your own. Without user special symbols.
public class Test {
public static void main(String[] args) {
String str = "y z (111)";
String p1 = "x x (111)";
String p2 = ".* .* \\(111\\)";
p1 = escapeRE(p1);
p1 = p1.replace("x", ".*");
System.out.println( p1 + "-->" + str.matches(p1) );
//.*\ .*\ \(111\)-->true
System.out.println( p2 + "-->" + str.matches(p2) );
//.* .* \(111\)-->true
}
public static String escapeRE(String str) {
//Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
//return escaper.matcher(str).replaceAll("\\\\$1");
return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1");
}
}
Pattern.quote("blabla") works nicely.
The Pattern.quote() works nicely. It encloses the sentence with the characters "\Q" and "\E", and if it does escape "\Q" and "\E".
However, if you need to do a real regular expression escaping(or custom escaping), you can use this code:
String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
This method returns: Some/\s/wText*/\,**
Code for example and tests:
String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
^(Negation) symbol is used to match something that is not in the character group.
This is the link to Regular Expressions
Here is the image info about negation:
I have a problem in getting the correct Regular expression.I have below xml as string
<user_input>
<UserInput Question="test Q?" Answer=<value>0</value><sam#testmail.com>"
</user_input>
Now I need to remove the xml character from Answer attribute only.
So I need the below:-
<user_input>
<UserInput Question="test Q?" Answer=value0value sam#testmail.com"
</user_input>
I have tried the below regex but did not worked out:-
str1.replaceAll("Answer=.*?<([^<]*)>", "$1");
its removing all the text before..
Can anyone help please?
You need to put ? within the first group to make it none greedy, also you dont need Answer=.*?:
str1.replaceAll("<([^<]*?)>", "$1")
DEMO
httpRequest.send("msg="+data+"&TC="+TC); try like this
Although variable width look-behinds are not supported in Java, you can work around it with .{0,1000} that should suffice.
Please check out this approach using 2 regexes, or 1 regex and 1 replace. Choose the one that suits best (I removed the \n line break from the first input string to show the flaw with using simple replace):
String input = "<user_input><UserInput Question=\"test Q?\" Answer=<value>0</value><sam#testmail.com>\"\n</user_input>";
String st = input.replace("><", " ").replaceAll("(?<=Answer=.{0,1000})[<>/]+(?=[^\"]*\")", "");
String st1 = input.replaceAll("(?<=Answer=.{0,1000})><(?=[^\"]*\")", " ").replaceAll("(?<=Answer=.{0,1000})[<>/]+(?=[^\"]*\")", "");
System.out.println(st + "\n" + st1);
Output of a sample program:
<user_input UserInput Question="test Q?" Answer=value0value sam#testmail.com"
</user_input>
<user_input><UserInput Question="test Q?" Answer=value0value sam#testmail.com"
</user_input>
First off, in your sample above, there is a trailing " after the email and > which I do not know if it was placed by error.
However, I will keep it there as according to your expected result, you need it to still be present.
This is my hack.
(Answer=)(<)(value)(>)(.+?([^<]*))(</)(value)(><)(.+?([^>]*))(>) to replace it with
$1$3$5$8 $10
The explanation...
(Answer=)(<)(value)(>) matches from Answer to the start of the value 0
(.+?([^<]*) matches the result from 0 or more right to the beginning < which starts the closing value tag
(</) here, I still select this since it was dropped in the previous expression
(><) I will later replace this with a space
(.+?([^>]*) This matches from the start of the email and excludes the > after the .com
(>) this one selects the last > which I will later drop when replacing.
The trailing " is not selected as I will rather not touch it as requested.