Input:
Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh.
Output:
A i e, t o s a, v v n.
I need a javascript function to solve this.
I'm trying something like this:
function short_verse(verse) {
let result = [];
verse.split(' ').map(word => word.charAt(0) != '' ? result.push(word.charAt(0)) : '');
return result.join(" ");
}
let input = "Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh.",
output = short_verse(input);
console.log(output);
The story: They say you can memorize texts this way. :) So, I create an application that will include this feature, too.
Update:
It should work for non-ascii chars, too. Example:
Input: Aliqușam țipsum ex, tempăs ornâre semper ac, varius vitae îbh.
Output: A ț e, t o s a, v v î
Note: In my case romanian diacritics would be enough - ăâîșțĂÂÎȘȚ.
CodePudding user response:
We can use a regex replacement approach here:
var input = "Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh.";
var output = input.replace(/(\w)\w*/g, "$1");
console.log(output);
CodePudding user response:
The following function should work for characters, numbers and symbols. The magic is in the regex; [a-zA-ZÀ-ÿăâîșțĂÂÎȘȚ]
extracts all unique words that contain alphanumeric and romanian alphabet characters (as per question request), \s
extracts all space characters as we want to preserve the spacing and finally ^\w\s
extracts all non-alphanumeric and non-space characters - a.k.a symbols:
function short_verse(verse) {
let result = [];
const tokens = verse.match(/([a-zA-ZÀ-ÿăâîșțĂÂÎȘȚ] )|(\s)|[^\w\s]/g);
const firstChars = tokens.map((token) => token.charAt(0));
return firstChars.join('');
}
let input1 = "Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh.";
console.log(short_verse(input1));
let input2 = "Să fie o întindere între ape, și ea să despartă apele de ape."
console.log(short_verse(input2));
CodePudding user response:
If you are using only word characters, you can keep the first character and remove the rest of the word characters.
\B
matches a non word boundary and \w
matches 1 or more word characters:
const s = "Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh.";
console.log(s.replace(/\B\w /g, ""));
For the updated question, you can capture leading chars other than any letter or whitespace char, followed by a single letter. Follow optional letters that should be removed, and use capture group 1 in the replacement.
([^\p{L}\s]*\p{L})\p{L}*
See the regex matching in this regex demo.
[
"Dumnezeu a zis: „Să fie o întindere între ape, și ea să despartă apele de ape.”",
"Aliqușam țipsum ex, tempăs ornâre semper ac, varius vitae îbh.",
"Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh."
].forEach(s =>
console.log(s.replace(/([^\p{L}\s]*\p{L})\p{L}*/gu, "$1"))
)
CodePudding user response:
This should do the trick. Probably you need to adjust the regex to include special chars, depending on your use case.
const input = "Aliquam ipsum ex, tempus ornare semper ac, varius vitae nibh."
const parsed = input.split(" ").map(w => w[0] (/^[A-Za-z0-9]*$/.test(w) ? "" : w[w.length - 1])).join(" ");
console.log(parsed);
CodePudding user response:
Try this
function short_verse(verse){
return verse.split(' ').reduce((acc,current) => (
`${acc}${current[0]}${current.slice(-1).match(/\W/)?current.slice(-1):''}`
),'')
}
You can replce \W with your preferred punctuation characters if needed.
Eg: .match(/[.!?\-]/)
CodePudding user response:
I used this regular expression /^(.)|[^\s,.!?:@]/g
, using method map()
. This works with non-ascii chars
in mind.
let input = "Aliqușam țipsum ex, tempăs ornâre semper ac, varius vitae îbh.";
let output = input.split(/\s /).map((w) => w.replace(/^(.)|[^\s,.!?:@]/g, "$1")).join(" ");
console.log(output);