/ / Smart divise le texte de grande taille en mots et en signes, comme des espaces et d’autres caractères - regex, string, scala, replace

Diviser de manière intelligente un texte de grande taille en mots et en signes, tels que des espaces et d’autres caractères - regex, chaîne, scala, remplacement

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">&nbsp;</span><span id="w3" class="word">two</span><span id="w4" class="space">&nbsp;</span><span id="w5" class="word">three</span><span id="w6" class="sign">,</span><span id="w7" class="space">&nbsp;</span><span id="w8" class="word">four</span><span id="w9" class="space">&nbsp;</span><span id="w10" class="word">five</span><span id="w11" class="space">&nbsp;</span><span id="w12" class="word">six</span><span id="w13" class="space">&nbsp;</span><span id="w14" class="word">seven</span><span id="w15" class="space">&nbsp;</span><span id="w16" class="word">eight </span><span id="w17" class="space">&nbsp;</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 № 1

Je ne peux pas vous donner le code complet, mais si cela peut vous aider à commencer ... je vous recommande:

  1. "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 avec b ê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.

  2. 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"

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.