Position d'une sous-chaîne
Dans « The kit parses logs: ERROR at line 12, then INFO, then ERROR again. », le premier ERROR se trouve à l'index 21, ligne 1, colonne 22, et finit avant 26. Points et crochets sont cherchés comme du texte ordinaire. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Calculer
- ERROR
- Indice
- 21
- Début
- 0
- Longueur
- 67
- Longueur de la recherche
- 5
Repérer la première occurrence d’une phrase est le premier pas de presque tout pipeline de texte : vous situez un marqueur, puis vous découpez, analysez ou surlignez à partir de cet index de caractères. Cet outil de position de sous-chaîne prend votre texte source et un terme de recherche non vide et renvoie l’index de caractères à base zéro de la première correspondance littérale, plus si elle a été trouvée, le décalage de fin exclusif, et la ligne et la colonne à base un pour sauter au résultat dans un éditeur. Le start optionnel permet de reprendre après une correspondance précédente. La correspondance optionnelle insensible à la casse couvre les brouillons mixtes. Les termes de recherche vides échouent en entrée invalide afin que les traitements par lots ne traitent jamais la chaîne vide comme une correspondance à chaque décalage.
Ce que signifie trouver la position d’une sous-chaîne et quand l’utiliser
La correspondance est littérale : si vous cherchez un point, une parenthèse ou un crochet, ces caractères sont du texte brut, pas une syntaxe d’expression régulière, de sorte que l’outil reste prévisible pour les non-développeurs et pour les pipelines qui ne doivent jamais être surpris par des caractères spéciaux. Préférez ce calculateur lorsque l’intention de recherche est de trouver la position d’une sous-chaîne, l’index d’une chaîne, de localiser la première occurrence ou d’obtenir le décalage d’un jeton.
Les sources typiques comprennent des lignes de journal où vous avez besoin du premier marqueur ERROR, des extraits de configuration où une clé doit être trouvée avant de couper une valeur, du HTML ou du markdown où un délimiteur de titre commence une section, et des cellules CSV ou TSV où commence un délimiteur ou un champ entre guillemets. La correspondance optionnelle insensible à la casse plie la casse des lettres afin que le premier Hello, HELLO ou hello soit saisi sans lister les variantes.
N’utilisez pas ce produit lorsque vous devez réécrire la correspondance — c’est une intention SEO distincte servie par les outils de remplacement de la première et de rechercher-remplacer — ni lorsque vous devez lister chaque occurrence, des groupes de capture, des lookarounds ou un moteur regex multiligne.
Usages courants et limites pratiques
Appelez l’outil gratuit dans le navigateur de position de sous-chaîne pour des contrôles de collage, des démonstrations en classe, le contrôle qualité de contenu et un repérage rapide sans installer un utilitaire de bureau ni écrire des extraits indexOf dans chaque langage. Un flux typique trouve le premier marqueur de section, lit index et end, puis découpe le titre qui suit.
Un autre flux parcourt les résultats successifs en envoyant le end précédent comme start suivant, ce qui localise la deuxième occurrence et les suivantes sans un outil de remplacement global. Associez ce point d’accès au remplacement de la première lorsqu’une étape ultérieure doit réécrire seulement ce résultat, ou au rechercher-remplacer lorsque chaque correspondance doit changer, mais gardez la position de sous-chaîne comme page d’atterrissage propre afin de ne pas mélanger l’intention SEO avec des éditeurs qui mutent le texte.
N’attendez pas un saut conscient des balises HTML, des champs de fusion de documents structurés, des index de grappes de graphèmes ni une collation spécifique à la locale au-delà de la correspondance standard insensible à la casse — ce sont des problèmes séparés.
Cas d’usage
Repérer le premier marqueur de journal ou d’erreur
Analyseurs et outils de support trouvent le premier ERROR, TODO ou délimiteur, puis découpent ou surlignent à partir de cet index de caractères sans réécrire le fichier.
Reprendre un parcours après un résultat précédent
Envoyez le end exclusif précédent comme start pour parcourir la deuxième occurrence et les suivantes une à une dans les modèles, journaux et fichiers de configuration.
Questions fréquentes
Comment trouver la position d’une sous-chaîne ?
L’index de la réponse est le décalage de caractères à base zéro de la première correspondance, ou -1 s’il n’y en a aucune.
L’index est-il à base zéro ou à base un ?
index est à base zéro, le même contrat que String indexOf de JavaScript, afin que vous puissiez le passer à slice. Lorsqu’une correspondance est trouvée, position est le numéro de caractère à base un attendu dans un éditeur, et line et column sont aussi à base un.
Que se passe-t-il si le terme de recherche est vide ?
Une chaîne find vide est rejetée afin que les pipelines ne traitent jamais la chaîne vide comme une correspondance à chaque décalage ; ces échecs ne sont pas facturés.
L’outil de position d’une sous-chaîne est-il gratuit ?
L’outil du navigateur s’exécute gratuitement sur votre appareil.
Find prend-il en charge les expressions régulières ?
Non. Le terme de recherche est toujours traité comme une chaîne littérale. Points, crochets et autres métacaractères de regex se correspondent eux-mêmes afin que le comportement reste prévisible pour les rédacteurs et les traitements par lots.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/str/index-of \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The kit parses logs: ERROR at line 12, then INFO, then ERROR again.","find":"ERROR"}'const res = await fetch("https://api.kit.forhosting.com/str/index-of", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The kit parses logs: ERROR at line 12, then INFO, then ERROR again.",
"find": "ERROR"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/index-of",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The kit parses logs: ERROR at line 12, then INFO, then ERROR again.",
"find": "ERROR"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/index-of", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The kit parses logs: ERROR at line 12, then INFO, then ERROR again.","find":"ERROR"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The kit parses logs: ERROR at line 12, then INFO, then ERROR again.","find":"ERROR"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/index-of", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"text": "The kit parses logs: ERROR at line 12, then INFO, then ERROR again.",
"find": "ERROR"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.index_of",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_chars | 100000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Ce que signifie trouver la position d’une sous-chaîne et quand l’utiliser
Trouver la position d’une sous-chaîne signifie parcourir la chaîne source de gauche à droite — ou depuis un décalage start optionnel —, s’arrêter à la première correspondance littérale non chevauchante d’un terme de recherche, et signaler l’index de caractères de ce résultat afin qu’une étape ultérieure découpe, analyse ou surligne à partir de là. Un terme de recherche vide lève invalid_input, ce qui protège les traitements par lots du piège classique consistant à traiter la chaîne vide comme une correspondance entre chaque caractère.
Contrat d’entrée, rejet d’une recherche vide et lecture de la réponse
Lorsqu’une correspondance est trouvée la réponse inclut aussi position comme l’index humain à base un, end comme le décalage de fin exclusif, line et column comme coordonnées d’éditeur à base un, et matched comme le morceau exact au résultat afin qu’une recherche insensible à la casse montre encore la casse d’origine. Une correspondance absente est un succès valide : found est false et index vaut moins un, le résultat honnête pour un haystack qui ne contient pas l’aiguille. Utilisez index avec slice lorsqu’un script découpera le reste ; utilisez line et column lorsqu’une interface doit défiler jusqu’au résultat ; utilisez found seul lorsqu’une porte ne s’intéresse qu’à l’existence du marqueur. Envoyez un corps JSON avec le champ chaîne obligatoire text fixé à la source que vous voulez examiner et le champ chaîne obligatoire find fixé à un terme de recherche non vide. Le start optionnel vaut zéro par défaut et est l’index UTF-16 à base zéro où le parcours commence, afin que vous puissiez reprendre après un résultat précédent sans réexaminer le préfixe. case_insensitive optionnel vaut false par défaut pour une casse exacte ; mettez-le à true lorsque le premier brouillon à casse mixte doit encore correspondre. Des alias sont acceptés pour les clients anciens : text aussi comme input, value, s, content, source ou haystack ; find comme search, needle, substring, query ou pattern ; start comme from, from_index ou offset ; case_insensitive comme ignore_case, ci ou insensitive. Un text manquant, un find manquant, une valeur non chaîne, un start négatif ou non entier, ou une chaîne find vide lèvent invalid_input avec un message qui nomme le problème, et ces échecs ne sont pas facturés sur l’API prépayée. La longueur est plafonnée à cent mille caractères afin que les parcours du navigateur et du Worker restent bornés. En succès la réponse inclut toujours index comme le décalage de caractères à base zéro ou moins un en l’absence de résultat, found comme booléen, text et find tels qu’appliqués, start et case_insensitive tels qu’utilisés, length et find_length comme longueurs en caractères, et method toujours égal à index_of.
Usage de l’API, tarifs, flux de travail et limites pratiques
Utilisez l’API prépayée du KIT lorsqu’un CMS, un job ETL, un backend de formulaires, un support, un analyseur ou un client mobile a besoin du même localisateur sous solde à $0.002 par élément réussi ; les échecs de validation ne consomment jamais de solde après le rejet du moteur. Les auteurs qui livrent des SDK peuvent documenter text et find comme champs obligatoires et montrer une source à plusieurs correspondances où seul le premier index est renvoyé, plus un exemple d’erreur de find vide, afin que les intégrateurs voient les deux côtés du contrat.
Cas d'intégration
QA et fixtures déterministes
Les harnais de test épinglent index, found, line et column afin qu’un refactor qui passe au remplacement, à la regex ou à la correspondance d’un find vide fasse échouer l’intégration continue immédiatement.