Je travaille sur une application Web pour le texteEn traitement. J'ai besoin de scinder la chaîne (texte) en mots et en signes, tels que des espaces et d'autres caractères (virgule, point, point-virgule, par exemple). Chaque mot et chaque signe dont j'ai besoin pour envelopper en balise html. Chaque balise doit avoir un attribut id, qui contient un nombre ordinal de mot (signe) dans le texte. Ce traitement fonctionnera dans le servlet Java, ce qui signifie que les performances sont importantes. Le texte traité peut contenir de 3000 à 5000 mots.
Voici un exemple d'entrée:
One two three, four five six seven eight nine.
Voici un exemple de sortie:
<span id="w1" class="word">One </span><span id="w2" class="space"> </span><span id="w3" class="word">two</span><span id="w4" class="space"> </span><span id="w5" class="word">three</span><span id="w6" class="sign">,</span><span id="w7" class="space"> </span><span id="w8" class="word">four</span><span id="w9" class="space"> </span><span id="w10" class="word">five</span><span id="w11" class="space"> </span><span id="w12" class="word">six</span><span id="w13" class="space"> </span><span id="w14" class="word">seven</span><span id="w15" class="space"> </span><span id="w16" class="word">eight </span><span id="w17" class="space"> </span><span id="w18" class="word">nine</span><span id="w19" class="sign">.</span>
Merci à tous pour tout conseil, comment je peux le faire.
Mettre à jour: Le code ci-dessous divise la chaîne en symboles non alphanumériques
text.split("[^a-zA-Z0-9]")
et ce code:
text.split("\b[a-zA-Z0-9]+\b")
scinde chaîne par mots, mais je ne comprends pas comment combiner regex pour scinder par mots et symboles non alphanumériques?
Mise à jour2:
Il semble que ce soit la réponse:
val text = "Hello from Scala - regex world!"
val pattern = "[^a-zA-Z0-9|а-яА-Я0-9]|\b[a-zA-Z0-9|а-яА-Я0-9]+\b".r
pattern.findAllIn(text).matchData foreach {
m => println(""" + m.group(0) + """)
}
La partie des motifs après le "|" signez qu'il est cyrillique pour:
a-zA-Z0-9
Réponses:
0 pour la réponse № 1Je ne peux pas vous donner le code complet, mais si cela peut vous aider à commencer ... je vous recommande:
"Séparer" votre chaîne en groupes de caractères en les associant
/b[a-zA-Z]+b|[^a-zA-Z]/g
Cette expression rationnelle associera des mots avec
b[a-zA-Z]+b
avecb
être une limite de mot, ou[^a-zA-Z]
tout autre caractère non alphabétique. Vous allez vous retrouver avec une liste de correspondances.En parcourant vos correspondances une par une, enveloppez vos résultats dans les balises appropriées en incrémentant l'identifiant et en vérifiant:
- si le premier caractère est un espace, alors
class="space"
- si le premier caractère est une lettre, alors
class="word"
- autre
class="sign"
- si le premier caractère est un espace, alors
Attention, la première regex comptera ...
en trois caractères séparés, ainsi que 123
comme trois signes séparés. Vous pourriez l'adapter avec
/b[a-zA-Z]+b|bd+b|...|[^a-zA-Z]/g
et ajoutez autant de cas spéciaux que vous le souhaitez, vous voyez l'idée.